从文件名中删除版本后缀

问题描述 投票:0回答:2

我想创建shell命令以从共享库名称除去扩展名,lib前缀和标准版本控制后缀中提取短名称。该命令必须对任何库名称都有效:

libexample.so -> example
example2.so -> example2
libexample-win32.so -> example-win32
libexample-15.so -> example
libexample-2.0.so -> example
libexample-2.0-15.so -> example
libexample-64-2.0-15.so -> example-64
libexample-16-to-10-converter-2.0-4.so -> example-16-to-10-converter
libexample-library2-64bit-2.0-15.so -> example-library2-64bit

当前我有此命令:

basename libexample-library2-64bit-2.0-15.so .so | sed -nre 's;(lib)*(.*)((-[.0-9]+)|$);\2;p'

它给了我

example-library2-64bit-2.0

但是我无法前进并使sed删除后缀-2.0。我尝试过:

basename libexample-library2-64bit-2.0-15.so .so | sed -nre 's;(lib)*(.*)((-[.0-9]+-[.0-9]+)|(-[.0-9]+)|$);\2;p'

但是它给了我example-library2-64bit-2.0。据我了解,这是由于sed正则表达式解析的贪婪性质。

有什么方法可以修改我的正则表达式以删除两个版本后缀?

regex sed
2个回答
1
投票
sed -E 's/^lib|(-[0-9]+(\.[0-9]+)?)?(-[0-9]+)?\.so$//g'
  • [^lib从行首删除lib
  • (-[0-9]+(\.[0-9]+)?)?,这将可选地匹配-,然后是数字,然后是可选的.和数字
    • 如果您始终有第二部分,则可以将其简化为(-[0-9]+\.[0-9]+)?
  • [(-[0-9]+)?可选匹配-,后跟数字
  • \.so匹配扩展名

?量词与前一个元素的01次匹配。由于它是贪婪的,因此将尽可能匹配。


1
投票

您可以将此sed与正则表达式中的3个替换一起使用:

sed -E 's/^lib|-[0-9]+\..*|\.[^.]+$//g' file

example
example2
example-win32
example
example
example
example-64
example-16-to-10-converter
example-library2-64bit

正则表达式正在使用3个交替:

  • [^lib:在开始时匹配lib
  • |:OR
  • [-[0-9]+\..*:匹配-,后跟1+个数字和一个点,后跟任何字符,直到结尾
  • |:OR
  • [\.[^.]+$:匹配一个点,然后匹配1个或多个非点字符,直到结尾

RegEx Demo


0
投票

您可以使用此sed

sed -E 's/^lib|-[0-9]+\..*|\.[^.]+$//g' file

example
example2
example-win32
example
example
example
example-64
example-16-to-10-converter
example-library2-64bit
© www.soinside.com 2019 - 2024. All rights reserved.