2013-08-20 125 views
2

我看到关于sed命令的问题很多,但没有一个符合我的家伙。sed:替换含有图案的线

我想替换包含模式的整个行。

我认为sed命令是最好的选择。我开始与这个sed命令,但不起作用

sed -i 's/pattern/Substitution/' myfile.txt 

在那之后我与这个命令的其它测试,但只有替代模式,而不是整个行。

echo "hello y luego bye" | sed "s|hello|adeu|g" 

回答

10

您需要匹配包含该模式的整行然后替换。使用这样的:

sed 's/^.*\bpattern\b.*$/Substitution/' file 

我还添加了\b word边界,所以你只匹配pattern但要避免匹配patterns

说明:^.*\bpattern\b.*$我们用来确保整行匹配包含模式。 ^是行开始,$行结束。 .*匹配0或更多长度的文本。因此^.*匹配pattern.*$之前的所有文本匹配pattern之后的所有文本。

使用awk的,你可以这样做:

awk '!/affraid/{print} /affraid/{print "Substitution"}' file 
+0

谢谢,可以完美运行。但是能否在模式之前解释'^。*'的含义以及之后的'。* $'是什么意思?提前致谢。 –

+0

我不明白你对\ b的解释,因为没有\ b很好。 –

+1

'\ b'用于单词边界。使用'\ b'匹配字符串将是:'^。* pattern。* $',它也可以匹配一行,例如:'123 mypatterns foo',但是当我使用'^。* \ bpattern \ b。* $'它时将不符合该线。 – anubhava