1

sed用来替换文件中的各种文本,例如:

sed -i "s/a/b/g" ./file.txt

我文件中的每一行都包含 , ],它是一个右方括号和一个空格。在此之前,我不想对任何东西进行替换。以下是一些示例行:

This is some text ] This is some other text.
                    ^

我已经放置了一个胡萝卜来标记可以开始替换的位置。其他右方括号可能会出现在该行的后面,但从未出现过,例如:

This is some more text ] This is yet some other text ] This is some more.
                         ^

这将取代胡萝卜之后的任何火柴。后面的方括号就不重要了。

  • 如何限制仅替换第一次出现在一行sed后找到的匹配项?]
4

2 回答 2

2

你可以做:

sed -i 's/^\([^]]*].*\)a/\1b/' file.txt

请注意,-i您使用的标志是非 posix 扩展。

于 2012-05-15T02:40:27.127 回答
2

到目前为止,其他答案仅在“]”之后出现一次时才替换“a”。由于您使用g全局规范,我假设“a”可能在右括号之后出现多次,并且您想要替换所有这些。为此,请使用“分而治之”的方法。

$ echo "foo abc ] bar ] baz" | sed 's/] /&\n/;h;s/.*\n//;s/a/X/g;x;s/\n.*//;G;s/\n//'
foo abc ] bXr ] bXz

这只会考虑第一个右方括号。

于 2012-05-15T04:43:09.400 回答