如何使用 Bash 获取 .so 文件后的版本号?
我已经获取了库的完整路径并提取了名称。例如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
我不能保证它能捕捉到每一个极端情况,但是
grep -Po '\.so\.\K([0-9]+\.)*[0-9]+'
- 匹配并丢弃
.so.
左侧的文字(使用 PCRE\K
修饰符) - 匹配零次或多次出现的一个或多个数字,后跟
.
- 匹配一个或多个数字
请注意,我们不想像原始表达式那样将其锚定到字符串的末尾($
),以允许尾随字符串,例如-PRE-GIT
答案2
使用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
答案3
这适用于您提供的示例,并且只要输入字符串遵循以下模式就会起作用.*\.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