sed全字搜索和替换

时间:2009-06-23 11:37:18

标签: shell sed

如何使用sed搜索和替换整个单词?

否则

sed -i 's/[oldtext]/[newtext]/g' <file> 

还会替换我不希望它做的[oldtext]的部分匹配。

6 个答案:

答案 0 :(得分:145)

正则表达式中的

\ b匹配单词边界(即第一个单词字符和非单词字符之间的位置):

$ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
no bar embarassment

答案 1 :(得分:124)

在Mac OS X上,这些正则表达式语法的 都不适用于 sed 以匹配整个单词

  • \bmyWord\b
  • \<myWord\>

现在听我说再见,这个丑陋的语法是你需要使用的:

  • /[[:<:]]myWord[[:>:]]/

因此,例如,将 mint 替换为 minty 仅用于整个单词:

  • sed "s/[[:<:]]mint[[:>:]]/minty/g"

来源:re_format man page

答案 2 :(得分:12)

\b用于字边界:

sed -i 's/\boldtext\b/newtext/g' <file>

答案 3 :(得分:7)

在我的一台机器中,用“\b”(没有引号)分隔单词不起作用。解决方案是使用“\<”来开始分隔符,使用“\>”来结束分隔符。

Joakim Lundberg的例子说明:

$ echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
no bar embarassment

答案 4 :(得分:2)

shell命令中的

echo "bar embarassment" | sed "s/\bbar\b/no bar/g" 

或:

echo "bar embarassment" | sed "s/\<bar\>/no bar/g"

但是如果你在vim中,你只能使用后者:

:% s/\<old\>/new/g

答案 5 :(得分:-1)

$ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1'
no bar embarassment