我有一个字符串变量$LIBRARIES="abc.so.1 def.so.1 hij.so.3.1"
,我想替换所有 .so ,使它们看起来像这样:
"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,流式编辑器工具's/\.so[^ ]*/\.so\*/g'
:使用正则表达式(regex)来匹配模式和替换。让我们进一步分解这个语法:
s/
“代替”; 例如:s/A/B/g
替换所有出现的A
withB
\.so[^ ]*/
:匹配任何以 开头的模式,.so
该[^ ]*
部分表示“后跟零个或多个非空格字符”\.so\*/
: 用字面替换.so*
[
, ]
,.
和*
在正则表达式中具有特殊含义,因此如果您要按字面意思使用它们,您只需通过前缀 a 来“转义”它们\
g
: 对所有事件都这样做,而不仅仅是第一次。<<< "$LIBRARIES"
:<<<
表示法称为herestring : 在这种情况下,它完成与 相同的事情echo "$LIBRARIES" | sed ...
,但它保存了一个子shell。