Как я могу получить номер версии после .so файла с помощью Bash?
Я получил полный путь библиотеки и извлек имя. Как libpcap.so.1.1.1
. Теперь я должен получить номер версии после so
; например:
libpcap.so.1.1.1 --> 1.1.1
libusb-0.1.so.4.4.4 --> 4.4.4
libpcap.so.1.8.0-PRE-GIT --> 1.8.0
Править: Пример кода с помощью grep может обработать первые два примера. Но не третье.
grep -Eo '[0-9][^[:alpha:]]+$' <<<'libpcap.so.1.5.3'
Я не гарантирую, что это поймает каждый угловой случай, но как насчет
grep -Po '\.so\.\K([0-9]+\.)*[0-9]+'
.so.
слева (использующий модификатор PCRE \K
) .
Примечание, что мы не хотим привязывать его в конец строки ($
), как Ваше исходное выражение делает, для обеспечения запаздывающей строки такой как -PRE-GIT
Используя awk
:
awk -F'.so.' '{match($2,/([0-9]+\.*)+/);print substr($2, RSTART, RLENGTH)}
<час> Примеры
$ awk -F'.so.' '{match($2,/([0-9]+\.*)+/);print substr($2, RSTART, RLENGTH)}' <<<'libpcap.so.1.8.0-PRE-GIT1'
1.8.0
$ awk -F'.so.' '{match($2,/([0-9]+\.*)+/);print substr($2, RSTART, RLENGTH)}' <<<libpcap.so.1.1.1\nlibusb-0.1.so.4.4.4\nlibpcap.so.1.8.0-PRE-GIT'
1.1.1
4.4.4
1.8.0
Это работает на примеры Вы, если, и будет работать, пока входная строка следует за шаблоном .*\.so\.[0-9.]*.*
:
grep -Po '.*\.so.\K[0-9.]*' <<<'libpcap.so.1.1.1'
Это будет соответствовать самой широкой последовательности цифр / точки после последнего .so.
подстрока, если таковые имеются.
% grep -Po '.*\.so.\K[0-9.]*' <<<libpcap.so.1.1.1\nlibusb-0.1.so.4.4.4\nlibpcap.so.1.8.0-PRE-GIT'
1.1.1
4.4.4
1.8.0