Sed只替换完全匹配

时间:2013-12-05 09:54:00

标签: unix sed

我不想在文件中用Europe12替换Europe12_yesturday之类的字符串。不更改文件中也存在的Europe12-36字符串。

我试过了:

$basename=Europe12
sed -i 's/\b$basename\b/${basename}_yesterday/g' file.txt

但这也改变了Europe12-36字符串。

5 个答案:

答案 0 :(得分:1)

手动构建所需的分隔符列表,而不是使用\b\W\<-不是单词characters(alphanumericals)的一部分,所以这也是为什么它也匹配你的其他字符串。所以尝试这样的事情,根据需要扩展列表:[-a-zA-Z0-9]

答案 1 :(得分:1)

需要空格或行尾字符:

sed 's/Europe12\([ ]|$\)/Europe12_yesturday\1/g' input

答案 2 :(得分:0)

你可以做2次:

sed -e 's/Europe12/Europe12_yesturday/g' -e 's/Europe12_yesturday-36/Europe12-36/g' file.txt

答案 3 :(得分:0)

sed 's/\(Europe12[[:blank:]]\)/\1_yesturday/g;s/Europe12$/&_yesturday/' YourFile

[[:blank:]]可以用你接受的任何边界完成,例如。,;:/])等(在这种情况下要小心这个字符的正则表达式意思)

答案 4 :(得分:0)

回复已经很晚了.. 它可以通过&#34;字边界&#34;轻松实现。符号(\&lt; .. \&gt;)

sed -i 's/\<$basename\>/${basename}_yesterday/g' file.txt