查找并替换sed中的排除个案


1

我试图sed在某个模式后添加一个字符串,但我想排除已经存在附加字符串的情况。

例如:

"text.txt"

Hello
Bar
Hello world!

如果我使用sed -i -e 's/Hello/Hello world!' text.txt第三行成为

Hello world! world!

但我想保持原样。

我找到了这个相关的问题,但并不是我的文件中的所有行都需要修改。

有人有这方面的食谱吗?


3
事实上,相关问题为您提供了所需的一切。/Hello world!/ !s/Hello/Hello world!/
choroba

啊,谢谢。天哪,我无法理解这一点。
雅克·高丁

请@choroba将其作为答案附上一行解释,以便OP可以接受。
simlev

Answers:


1

您的问题的答案隐藏在相关问题的答案之一中:

/Hello world!/ ! s/Hello/Hello world!/

它的第一部分是“地址”,即以下命令仅适用于与其匹配的行。的!否定条件,即,在命令将只被应用到线匹配的地址。换句话说,替换HelloHello world!不包含的行Hello world!


这可能更清楚地表达/Hello world!/! s/Hello/Hello world!/(注意到的位置!)......这种方式否定与地址相关,而不是与替换相关联。
Attie

2

您可以使用明确的行开头和行结束(^$):

$ sed -e 's/^Hello$/Hello world!/' <<EOF
> Hello
> Bar
> Hello world!
> EOF
Hello world!
Bar
Hello world!

通过使用\0替换整个匹配的可读性/简洁性,这也可以在某种程度上得到改善......这样您就不需要重复Hello

$ sed -e 's/^Hello$/\0 world!/' <<EOF
> Hello
> Bar
> Hello world!
> EOF
Hello world!
Bar
Hello world!
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.