这个sed命令出了什么问题

时间:2015-04-10 20:10:11

标签: bash sed

我必须改变第一次出现的单词''并将其替换为“这个'在每行输入文本中,区分大小写搜索和替换。

以下是我执行任务的命令,但是出错了

  

sed' s / \ Wthe \ W / this /'

我发现的问题类似于这个模拟案例:

输入文字:为单词

输出文字(正确):作为该词

输出文字: asthatword (命令生成的内容)。

4 个答案:

答案 0 :(得分:6)

\WPCRE,而不是BRE or ERE。因此,标准sed不支持它。

sed 's/(^|[[:space:]])the([[:space:]]|$)/\1this\2/'

^|[[:space:]]中,^匹配行的开头; [[:space:]]匹配任何空白字符类。将其放在括号内会创建一个匹配组,稍后可以使用\1引用该组(因为这是第一个这样的组)。

[[:space:]]|$也会这样做,但$表示行尾。


那就是说 - 如果你只针对GNU sed,而不是POSIX sed,你可能会考虑:

sed 's/\<the\>/this/'

答案 1 :(得分:0)

您需要捕获围绕单词the的非单词,然后使用反向引用代替:

s='as the word'
sed 's/\(\W\)the\(\W\)/\1this\2/' <<< "$s"
as this word

或更好地使用单词边界:

sed 's/\bthe\b/this/' <<< "$s"
as this word

答案 2 :(得分:0)

您正在替换非单词字符(在这种情况下为空格)。一个简单的方法是

sed 's/\Wthe\W/ that /'

sed 's/\(\W\)the\(\W\)/\1that\2/'

保留原始的非单词字符。

答案 3 :(得分:0)

我假设你正在使用\W来进行整个单词的搜索和替换。请尝试使用\b来设置字边界:

sed 's/\bthe\b/this/'