在 Bash 中获取库名称和扩展名后的版本号

在 Bash 中获取库名称和扩展名后的版本号

如何使用 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

相关内容