Получение номера версии после названия библиотеки и расширения в Bash

Как я могу получить номер версии после .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'
1
задан 18 January 2016 в 22:29

3 ответа

Я не гарантирую, что это поймает каждый угловой случай, но как насчет

grep -Po '\.so\.\K([0-9]+\.)*[0-9]+'
  • соответствие и отбросит литерал .so. слева (использующий модификатор PCRE \K)
  • нуль соответствия или больше случаев одной или нескольких цифр, сопровождаемых .
  • соответствие одна или несколько цифр

Примечание, что мы не хотим привязывать его в конец строки ($), как Ваше исходное выражение делает, для обеспечения запаздывающей строки такой как -PRE-GIT

3
ответ дан 7 December 2019 в 12:41

Используя 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
1
ответ дан 7 December 2019 в 12:41

Это работает на примеры Вы, если, и будет работать, пока входная строка следует за шаблоном .*\.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
-1
ответ дан 7 December 2019 в 12:41

Другие вопросы по тегам:

Похожие вопросы: