仅在匹配整个单词时替换模式

JDi*_*zle 8 sed

可以说我尝试像这样替换

asdasdasdHit Hitasdasd Hit Hit
Hitasda Hit Hit asdaHit Hit Hit
Hit Hitasda Hit
...
...
Run Code Online (Sandbox Code Playgroud)

有没有办法让每个“干净”的 Hit 替换为 OK?我试过 /g 但后来一切都好s/\ Hit\ /OK/g起来了,换行符上的命中会丢失。

Kus*_*nda 14

是的。

$ sed 's/\<Hit\>/OK/g' file
asdasdasdHit Hitasdasd OK OK
Hitasda OK OK asdaHit OK OK
OK Hitasda OK
...
...
Run Code Online (Sandbox Code Playgroud)

\<会在单词的开头匹配零长度字边界,并且\>将这样做在一个单词的结尾。

零长度岬\<,并\>意味着他们不会在自己的和匹配任何字符,但力量毗邻模式来匹配一个字边界上。

字边界是在一个字符串的点处的字母数字字符是邻近于非字母数字字符,例如之间的点?(一个空格)和H之间的点t?在字符串中(另一个空间)?Hit?,或在之间的点t以及示例数据中所有三行的紧随其后的换行符。

使用 GNU,sed您可以\b代替\<and \>(尽管它也理解\<and \>):

$ sed 's/\bHit\b/OK/g' file
Run Code Online (Sandbox Code Playgroud)

...但BSDsed不明白\b

  • 对于您关于不理解 `\b` 的 BSD sed 的最后评论,只需将 sed 更改为 `perl -pe` 保持所有其余命令保持原样,并且可以在任何地方工作...... (2认同)