Bash:字符串操作在空格上终止

时间:2012-11-28 17:10:54

标签: linux bash unix

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

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

我该怎么做?我试过NEW_LIBRARIES=${LIBRARIES//.so*/.so$star},但它不起作用。我怎么能告诉它以空白结束?

2 个答案:

答案 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。