我有一个字符串变量$LIBRARIES="abc.so.1 def.so.1 hij.so.3.1"
,我想替换所有.so,使它们看起来像这样:
"abc.so* def.so* hij.so*"
我该怎么做?我试过NEW_LIBRARIES=${LIBRARIES//.so*/.so$star}
,但它不起作用。我怎么能告诉它以空白结束?
答案 0 :(得分:1)
或更简单
${LIBRARIES//.[0-9]/*}
有2个扩展名的人将获得2 **但这应该没问题
答案 1 :(得分:0)
这应该这样做:
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=$(...)
:$(...)
符号称为command subsitution;基本上它会生成一个新的子shell来运行其中包含的任何命令,然后将输出返回到这个新的子shell stdout
(此处将其保存到NEW_ALL_LIBRARIES
)。sed
:调用流媒体编辑工具sed 's/\.so[^ ]*/\.so\*/g'
:使用regular expressions (regex)匹配模式并替换。让我们进一步打破这种语法:
s/
“替代”;例如:s/A/B/g
将所有A
替换为B
\.so[^ ]*/
:匹配以.so
开头的所有模式,[^ ]*
部分表示“后跟零个或多个非空格字符”\.so\*/
:将其替换为字面.so*
[
,]
,.
和*
在正则表达式中具有特殊含义,因此如果您想按字面意思使用它们,则只需“逃避”它们通过加\
g
:对所有事件都这样做,而不仅仅是第一次。<<< "$LIBRARIES"
:<<<
符号称为herestring:在此上下文中,它与echo "$LIBRARIES" | sed ...
完成相同的操作,但它会保存子shell。