我试图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!/
它的第一部分是“地址”,即以下命令仅适用于与其匹配的行。否定!
条件,即该命令仅适用于行不是匹配地址。换句话说,替换Hello
为Hello 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!