2

读到您可以替换从第二个开始的所有匹配sed

您可以将数字与 g(全局)标志结合使用。例如,如果您想保留第一个单词,但将第二个、第三个等改为 DELETED,请使用 /2g:

例子

sed 's/foo/bar/2g' a.txt

但是,如何将匹配替换第二个,以便第三个、第四个等不受影响?就像是

sed 's/foo/bar/1-2' a.txt
4

3 回答 3

2

这可能对您有用(GNU sed):

sed 's/foo/&\n/2;T;h;s//bar/g;G;s/\n.*\n//' file

将第 n 次出现的预期字符串替换为自身和换行符。如果替换失败,则将模式空间 (PS) 复制到保持空间 (HS)。使用替换字符串进行替换,然后用更改的行重构原始行。

还:

sed 's/foo/\n/g;s/\n/foo/3g;s/\n/bar/g' file

其中第 n 个 +1 用于代替第 1 到第 n 个

于 2013-02-23T19:07:35.047 回答
0

最简单的方法是:

sed 's/foo/bar; s/foo/bar' a.txt

这将有效地替换 2 的第一次出现foo。它每行进行两次传递,总是替换第一次出现。由于在第二遍时第一个foo已经被替换,第二遍“看到”原始的第二次出现作为第一次出现。

于 2013-02-23T18:12:09.987 回答
0

扩展奇洛的答案......

replace_string=s/foo/bar
n=2
replace_string_n=`python -c 'print "'$replace_string';"*'$n`

sed $replace_string_n a.txt
于 2013-02-23T18:29:13.130 回答