1

我有一个字符串变量$LIBRARIES="abc.so.1 def.so.1 hij.so.3.1",我想替换所有 .so ,使它们看起来像这样:

"abc.so* def.so* hij.so*" 

我怎样才能做到这一点?我试过NEW_LIBRARIES=${LIBRARIES//.so*/.so$star}了,但它不起作用。我怎么能告诉它以空格结束?

4

2 回答 2

1

或更简单

${LIBRARIES//.[0-9]/*}

带有 2 个扩展名的将获得 2 ** 但这应该没问题

于 2012-11-28T18:02:00.870 回答
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=$(...):该$(...)符号称为命令替换;基本上它会生成一个新的子shell 来运行其中包含的任何命令,然后将输出返回到这个新的子shell stdout(并在此处将其保存到NEW_ALL_LIBRARIES)。
  • sed: 调用sed,流式编辑器工具
  • 's/\.so[^ ]*/\.so\*/g':使用正则表达式(regex)来匹配模式和替换。让我们进一步分解这个语法:
    • s/“代替”; 例如:s/A/B/g替换所有出现的AwithB
    • \.so[^ ]*/:匹配任何以 开头的模式,.so[^ ]*部分表示“后跟零个或多个非空格字符”
    • \.so\*/: 用字面替换.so*
    • 一些符号,如[, ],.*在正则表达式中具有特殊含义,因此如果您要按字面意思使用它们,您只需通过前缀 a 来“转义”它们\
    • g: 对所有事件都这样做,而不仅仅是第一次。
  • <<< "$LIBRARIES":<<<表示法称为herestring : 在这种情况下,它完成与 相同的事情echo "$LIBRARIES" | sed ...,但它保存了一个子shell。
于 2012-11-28T17:19:05.080 回答