在 sed 中查找并替换排除情况

在 sed 中查找并替换排除情况

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

例如:

"text.txt"

Hello
Bar
Hello world!

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

Hello world! world!

但我想保持它的完整性。

我发现这个相关问题但我的文件中的所有行都不需要修改。

有人有这个菜谱吗?

答案1

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

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

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

答案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!

相关内容