取代第n场比赛

时间:2013-02-23 18:05:52

标签: bash sed

使用sedread,您可以替换从第二个

开始的所有匹配项
  

您可以将数字与g(全局)标志组合在一起。例如,如果你愿意的话   单独保留第一个单词,但将第二个,第三个等更改为DELETED   相反,使用/ 2g:

例如

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

但是你怎么能在第二个匹配匹配,以便第三个,第四个等不受影响?像

这样的东西
sed 's/foo/bar/1-2' a.txt

3 个答案:

答案 0 :(得分: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

使用nth +1而不是1到nth

答案 1 :(得分:0)

最简单的方法是:

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

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

答案 2 :(得分:0)

延伸Chirlo的答案......

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

sed $replace_string_n a.txt