sed全字search和replace

如何使用sedsearch和replace整个单词?

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

也会取代我不想做的[oldtext]部分匹配。

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

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

在Mac OS X上, 两种正则expression式都不能sed内部匹配整个单词

  • \bmyWord\b
  • \<myWord\>

现在听我说,晚些时候相信我, 这个丑陋的语法是你需要使用的:

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

所以,例如,只用整个单词来replace薄荷

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

来源: re_format手册页

使用\b作为单词边界:

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

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

用Joakim Lundberg的例子来解释一下:

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

在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 
 $ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1' no bar embarassment