Bash:字符串操作在空白处终止



我有一个字符串变量$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/gB替换所有出现的A
    • .so[^ ]*/:匹配以.so开头的任何模式,[^ ]*部分的意思是"后面跟着零个或多个非空格字符">
    • .so*/:将其替换为字面上的.so*
    • 一些符号,如[].*,在正则表达式中有特殊含义,所以如果你想从字面上使用它们,只需在它们前面加一个就可以"转义"它们
    • g:对所有出现的情况都这样做,而不仅仅是第一次
  • <<< "$LIBRARIES"<<<表示法被称为herestring:在这种情况下,它完成了与echo "$LIBRARIES" | sed ...相同的事情,但它保存了一个子shell

相关内容

  • 没有找到相关文章

最新更新