如何使用sed替换文件中相同正则表达式的第三次出现?

时间:2011-11-30 17:22:42

标签: bash sed

我在查找sed脚本时遇到问题,该脚本在正则表达式看起来完全相同时有效,但我只想替换一个。

该文件如下所示:

something someting something
this 
something someting something
something someting something
this 
someting something
someting something
someting something
this
someting something
someting something
this

我想用第三个“this”代替其他东西。我尝试过:

sed '3,/this.*/s/this.*/something/'

和各种类似的尝试,但它不起作用。

4 个答案:

答案 0 :(得分:4)

这在sed中并不容易,但是awk可以做到这一点

awk '/this/{count++;if(count==3){sub("this","something")}}1'

答案 1 :(得分:2)

尝试类似:

# do nothing the first 2 times (weird sed counting makes that 3)
3,/this.*/n
# then, substitute only once
1,/this.*/ s/this.*/foo/ 

要将换行符嵌入shell脚本中,我可能会使用GNU“echo -e”来欺骗“\ n”:

sed -e "$(echo -e "3,/this.*/n\n1,/this.*/ s/this.*/foo/ ")"

答案 2 :(得分:1)

我实际上不会说在sed中是不可能的;我肯定会说这不适合这份工作。我会选择Perl,但选择你喜欢的脚本语言。

未测试!

#!/usr/bin/env perl
use strict;
use warnings;
my $this_count = 0;
LINE:
while (<>)
{
    if (m/^this$/ && ++$this_count == 3)
    {
        $_ = "that\n";  # Note the newline; I didn't chomp!
    }
    print;
}

答案 3 :(得分:1)

这可能对您有用:

 sed '/this/{x;s/^/X/;/^XXX$/!{x;b};x;s/this/something/}' file

说明:

每次出现this时,X会向保留空间(HS)附加X。如果HS包含3个this,请将something替换为sed -e '/this/{x;s/^/X/;/^XXX$/!{x;b};x;c\something' -e '}' file

编辑:

这也会起作用(基本相同的想法):

{{1}}