替换shell脚本中的子字符串



我有一个字符串"st xxx street st st",我想改为"street xxx street street"。我可以取代中间的st,但我怎么能取代其他人呢。这是我到目前为止的代码:

#!/bin/bash
SPACE=" "
input="st xxx street st st"
search_string="st"
replace_string="street"
output=${input//$SPACE$search_string$SPACE/$SPACE$replace_string$SPACE}

如果可能的话,请尝试使用sed

echo "$input" | sed 's/bstb/street/g'

GNUsed中的b是指单词边界。

另请参阅:只有匹配项构成一个完整的单词,我才能找到并替换它?

我假设在行首或行尾永远不会出现street

我建议你试试这个:

  1. 使所有street出现在st:

    output=${input//$SPACE$replace_string$SPACE/$SPACE$search_string$SPACE}
    
  2. 现在,您可以安全地将st更改为street,而不需要空格:

    output2=${output//$search_string/$replace_string}
    

我尝试了一个"简单愚蠢"的过程,在这个过程中,我首先将所有空格更改为换行符,然后搜索只包含"st"的(临时(行,并将其更改为street,最后将换行符还原回来。

input='anst xxx street st st'
echo "$input" | sed 's/ /n/g' | sed 's/^st$/street/g' | tr 'n' ' ' | sed 's/ $/n/'

输出:

anst xxx street street street

仅包含st的单词不得替换

将这两个相加

output=${output//$search_string$SPACE/$replace_string$SPACE}
output=${output//$SPACE$search_string/$SPACE$replace_string}

评论更新,然后在|的帮助下

output="|${input//$SPACE$search_string$SPACE/$SPACE$replace_string$SPACE}|"
output=${output//"|$search_string$SPACE"/$replace_string$SPACE}
output=${output//"$SPACE$search_string|"/$SPACE$replace_string}
output=${output//|}

或者像Markante Makrele建议的

output=${input//$replace_string/$search_string}
output=${output//$search_string/$replace_string}

但最好使用sed。

最新更新