sed不适用于特殊字符

时间:2015-07-16 05:24:16

标签: regex sed

我正在尝试使用字边界处的sed替换文本。在查看Beginning and end of words in sed and grep后,我使用:

echo "It is a @ at a@ ." | sed "s/\ba\b/#/g"

输出:在@。

@

效果很好,但是当我尝试替换以@等特殊字符开头或结尾的单词时,它不起作用。

echo "It is a @ at a@ ." | sed "s/\b@\b/#/g"

输出:在@。

处是 @
echo "It is a @ at a@ ." | sed "s/\ba@\b/#/g"

输出:@在 a @

我错过了什么?如何使用sed替换以特殊字符结尾的整个单词?

1 个答案:

答案 0 :(得分:2)

您需要使用\B

$ echo "It is a @ at a@ ." | sed "s/\B@\B/#/g"
It is a # at a@ .

\b - 单词char和非单词char之间的匹配(反之亦然)

\B - 两个单词字符或两个非单词字符之间的匹配。

因此,@之前的字符是空格,这是一个非单词字符。因此,要匹配两个非单词字符之间存在的边界,您需要使用\B,并且@之后的字符也是空格字符。所以在这里,您还需要使用\B

对于第二种情况,你必须使用它,

$ echo "It is a @ at a@ ." | sed "s/\ba@\B/#/g"
It is a @ at # .

Demo