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

Replace sed替换上一行字符串匹配后第一次出现的字符串,replace,sed,line,match,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 | s

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

我想在[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/'  

我做错了什么?

单向假设
用问题的数据填充

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
这可能适用于您(GNU-sed):


很好的解决方案。我没有想过要用awk。请你解释一下这个命令,它在做什么。我知道这是可行的,但怎么办?一旦遇到模式“blabla”,只需将标志变量“f”设置为1。当遇到模式“Iam2”时,将其更改为“Iwas2”并重置标志。由于标志已重置,因此不会再出现“Iam2”。您好,感谢您的快速响应。
我尝试了突击队,但出现错误:
[user@machine]$sed-e'/[blabla]/,${s/Iam(2)/Iwas\1/;ta}b:a N;Ps/^[^\n]*\n/;ba'file.txt sed:-e expression#1,char 42:commands后面的额外字符您是否将其作为一行程序运行?在这种情况下,必须使用
分隔指令
awk 'f==1 && /Iam2/{$0="Iwas2";f=0}/blabla/{f=1}1' file
sed '/\[blabla\]/,/Iam2/!b;/Iam2/!b;s//Iwas2/;:a;n;$!ba' file