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質問のデータで仮定する1つの方法:

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 に答える