我有一个字符串变量$LIBRARIES="abc.so.1 def.so.1 hij.so.3.1"
,我想替换所有的.,这样它们看起来像这样:
"abc.so* def.so* hij.so*"
我该怎么做?我试过NEW_LIBRARIES=${LIBRARIES//.so*/.so$star}
,但它不起作用。我如何告诉它以空白结尾?
或更简单的
${LIBRARIES//.[0-9]/*}
有2个扩展的将获得2**,但这应该是好的
这应该做到:
LIBRARIES="abc.so.1 def.so.1 hij.so.3.1"
NEW_ALL_LIBRARIES=$(sed 's/.so[^ ]*/.so*/g' <<< "$LIBRARIES")
echo "$NEW_ALL_LIBRARIES"
输出:
abc.so* def.so* hij.so*
解释:
LIBRARIES="..."
:将字符串分配给变量时,变量不以$
为前缀NEW_ALL_LIBRARIES=$(...)
:$(...)
表示法称为命令子语句;基本上,它生成了一个新的子shell来运行其中包含的任何命令,然后将输出返回到这个新子shell的stdout
(此处将其保存到NEW_ALL_LIBRARIES
)sed
:调用sed,流式EDitor工具's/.so[^ ]*/.so*/g'
:使用正则表达式(regex)匹配模式并替换。让我们进一步分解一下这个语法:s/
"替代品";例如:s/A/B/g
用B
替换所有出现的A
.so[^ ]*/
:匹配以.so
开头的任何模式,[^ ]*
部分的意思是"后面跟着零个或多个非空格字符">.so*/
:将其替换为字面上的.so*
- 一些符号,如
[
、]
、.
和*
,在正则表达式中有特殊含义,所以如果你想从字面上使用它们,只需在它们前面加一个就可以"转义"它们
g
:对所有出现的情况都这样做,而不仅仅是第一次
<<< "$LIBRARIES"
:<<<
表示法被称为herestring:在这种情况下,它完成了与echo "$LIBRARIES" | sed ...
相同的事情,但它保存了一个子shell