2

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

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

文件.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/'  

我究竟做错了什么?

4

3 回答 3

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
于 2012-09-27T08:48:44.147 回答
4
awk 'f==1 && /Iam2/{$0="Iwas2";f=0}/blabla/{f=1}1' file
于 2012-09-27T08:48:53.077 回答
0

这可能对您有用(GNU sed):

sed '/\[blabla\]/,/Iam2/!b;/Iam2/!b;s//Iwas2/;:a;n;$!ba' file
于 2012-09-27T14:35:39.620 回答