sed在前一行的字符串匹配后替换第一次出现的字符串

时间:2012-09-27 08:32:47

标签: replace sed line match

我有一个问题,我真的希望找到答案 这是一个有几行相同的文件,但我只是想在匹配后替换第一次出现。

我想在[blabla]行之后将第一个Iam2更改为Iwas2。

file.txt的:

Iam  
Iam1  
Iam2  
Iam21  
[blabla]  
Iam3  
Iam2  
Iam3  
Iam2  

我试过了:

$ cat file.txt | sed '1,/[blabla]/a \' | sed '0,/Iam2/s//Iwas2/'  

以及

$ cat file.txt | sed '/[blabla]/a \' | sed '0,/Iam2/s//Iwas3/'  

我做错了什么?

3 个答案:

答案 0 :(得分:4)

假设infile包含问题数据的一种方式:

sed -e '
    ## From "[blabla]" until last line try to substitute "Iam2". If the
    ## substitution succeeds go to label "a".
    /\[blabla\]/,$ { 
        s/Iam\(2\)/Iwas\1/; 
        ta 
    }
    ## The substitution didn't succeed, so begin next cycle.
    b
    ## Label "a".
    :a
    ## Substitution succeed, so I don't want to repeat previous process. Now
    ## read each line and print it without modification until end of file.
    N; 
    P; 
    s/^[^\n]*\n//;
    ba
' infile

产量:

Iam  
Iam1  
Iam2  
Iam21  
[blabla]  
Iam3  
Iwas2
Iam3  
Iam2

答案 1 :(得分:4)

awk 'f==1 && /Iam2/{$0="Iwas2";f=0}/blabla/{f=1}1' file

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed '/\[blabla\]/,/Iam2/!b;/Iam2/!b;s//Iwas2/;:a;n;$!ba' file