我想创建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
正则表达式解析的贪婪性质。
有什么方法可以修改我的正则表达式以删除两个版本后缀?
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
匹配扩展名?
量词与前一个元素的0
或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个或多个非点字符,直到结尾您可以使用此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