sed全词搜索和替换


120

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

在做

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

还将替换[oldtext]我不希望执行的部分匹配。

Answers:


164

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

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


@OlegMazko我也来寻找posix可接受的方法在vim中使用,对我有用的是s / \ <7 // g。我试图在代码中的单词开头删除一个7。这个链接,特别是JP的解决方案,使我得到了答案:stackoverflow.com/questions/3864467/…(由于某种原因,无法获得像您一样嵌入的markdown)。
jimh '17

谢谢,我发疯了,试图替换“ and”一词,所以\band\b节省了一天:)
MitchellK

144

在Mac OS X上,两种正则表达式语法都不能sed内用于匹配整个单词

  • \bmyWord\b
  • \<myWord\>

现在听我说,以后再相信我,这个丑陋的语法就是您需要使用的语法:

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

因此,例如,仅在整个单词中用minty替换mint

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

资料来源:re_format手册页


19
只需sed通过MacPorts或Homebrew 安装GNU (以及其他所有GNU工具),并确保它排在您的首位PATH。使Mac相当有用是可能的。
吉姆·斯图尔特

9
@JimStewart是打破一堆假设“在OS X上像OS Xers一样工作”的工具的好方法。就是说,我绝对可以建议brew install coreutils,它是所有gnu工具的前缀。
ELLIOTTCABLE 2015年

16
brew install gnu-sed使用gsed
k107 2015年

brew coreutils很棒。是否还有其他的brew软件包可以安装一堆gnu版本的命令,或者我需要单独安装其余的软件包?
ckot 2015年

2
使用perl始终是一个更好的解决方案:perl -pe 's|\bone\b|two|g'。sed在这里和那里失败时稳定工作。
帕维尔·弗拉索夫

13

使用\bword边界:

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

3
注意[]o,l-> [newtext],[newtext]。您显然是说 sed -i 's/\boldtext\b/newtext/g'
JJoao 2014年

7

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

Joakim Lundberg的示例进行解释:

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

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

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

OP明确声明“使用sed”
ndemou,2014年

这是一个拆分操作联接,不是纯替换;这会将多个空格折叠为一个,并丢弃所有前导/后跟空格:例如echo " bar embarassment " | awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1' | cat -Egives no bar embarassment$
musiphil '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.