【问题标题】:sed not working for special characterssed 不适用于特殊字符
【发布时间】:2015-07-16 13:49:18
【问题描述】:

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

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

输出:# @ at a@ 。

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

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

输出:在 a@ 处是 @

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

输出:在 a@ 处是一个@。

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

【问题讨论】:

    标签: regex sed


    【解决方案1】:

    你需要使用\B

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

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

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

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

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

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

    Demo

    【讨论】:

      猜你喜欢
      • 2016-10-04
      • 2014-08-09
      • 2016-03-03
      • 1970-01-01
      • 2016-09-13
      • 2019-09-17
      • 1970-01-01
      • 2012-09-09
      • 2011-05-17
      相关资源
      最近更新 更多