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

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


我究竟做错了什么?

最佳答案

假定问题的数据为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

07-24 21:51