sed:替换包含指定模式的行

3

我看到很多有关sed命令的问题,但没有一个符合我的要求。

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

我认为使用sed命令是最好的选择。我尝试了以下sed命令,但并不起作用。

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

接下来我正在测试这个命令,但只替换模式,而不是整行。

echo "hello y luego bye" | sed "s|hello|adeu|g"
1个回答

12

您需要匹配包含该模式的整行,然后进行替换。使用方式如下:

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

我还添加了\b以匹配单词边界,这样您就只匹配pattern而避免匹配patterns

说明:使用^.*\bpattern\b.*$确保整行都包含pattern^是行首,$是行尾。 .*匹配长度为0或更多的文本。 因此,^.*匹配pattern之前的所有文本,.*$匹配pattern之后的所有文本。

使用awk可以实现:

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

谢谢,非常完美。但是你能解释一下模式前面的'^.'和后面的'.$'的含义吗?提前感谢。 - Jorge Vega Sánchez
我不理解你对\b的解释,因为没有\b也能正常工作。 - Jorge Vega Sánchez
1
"\b" 用于匹配单词边界。使用 "\b" 的匹配字符串将为: "^.pattern.$",它还可以匹配一行,例如:"123 mypatterns foo",但是当我使用 "^.\bpattern\b.$" 时,它不会匹配该行。 - anubhava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接