我有一个字符串"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
。
我建议你试试这个:
-
使所有
street
出现在st
:output=${input//$SPACE$replace_string$SPACE/$SPACE$search_string$SPACE}
-
现在,您可以安全地将
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。