我读到您可以替换从第二个开始的所有匹配sed
项
您可以将数字与 g(全局)标志结合使用。例如,如果您想保留第一个单词,但将第二个、第三个等改为 DELETED,请使用 /2g:
例子
sed 's/foo/bar/2g' a.txt
但是,如何将匹配替换到第二个,以便第三个、第四个等不受影响?就像是
sed 's/foo/bar/1-2' a.txt
这可能对您有用(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 个
最简单的方法是:
sed 's/foo/bar; s/foo/bar' a.txt
这将有效地替换 2 的第一次出现foo
。它每行进行两次传递,总是替换第一次出现。由于在第二遍时第一个foo
已经被替换,第二遍“看到”原始的第二次出现作为第一次出现。
扩展奇洛的答案......
replace_string=s/foo/bar
n=2
replace_string_n=`python -c 'print "'$replace_string';"*'$n`
sed $replace_string_n a.txt