sed:一致するものが見つかったら、前の行のテキストの一部を置き換えます。

sed:一致するものが見つかったら、前の行のテキストの一部を置き換えます。

次の行にが含まれている場合は、create_testファイルをに置き換えたいと思います。 sedを使用してファイルを含むファイル全体を処理するにはどうすればよいですか?#create_testpsfxxx_16_pi

入力ファイルの内容:

create_test -type hard -outer { 1.0000 } { \
    psfxxx_16_pi/psfop/deadline_north_re_0 }

create_test -type hard -outer { 0.0000 } { \
    psfxxx_16_pi/psfop/deadline_south_re_1 }

結果ファイル:

#create_test -type hard -outer { 1.0000 } { \
    psfxxx_16_pi/psfop/deadline_north_re_0 }

#create_test -type hard -outer { 0.0000 } { \
    psfxxx_16_pi/psfop/deadline_south_re_1 }

答え1

努力する

sed '/^create_test/ {N; /psfxxx/ s/^/#/}' file
#create_test -type hard -outer { 1.0000 } { \
    psfxxx_16_pi/psfop/deadline_north_re_0 }

#create_test -type hard -outer { 0.0000 } { \
    psfxxx_16_pi/psfop/deadline_south_re_1 }

create_test -type hard -outer { 1.0000 } { \
    vsfxxx_16_pi/psfop/deadline_north_re_0 }

create_test -type hard -outer { 0.0000 } { \
    vsfxxx_16_pi/psfop/deadline_south_re_1 }

「create_test」が見つかった場合は、次の行を追加し、行に「psfxxx」が含まれている場合は「#」プレフィックスが付きます。

答え2

別のsed方法:

$ sed -zE 's/create_test([^\n]*\n[^\n]*psfxxx_16_pi)/#create_test\1/g' file
#create_test -type hard -outer { 1.0000 } { \
    psfxxx_16_pi/psfop/deadline_north_re_0 }

#create_test -type hard -outer { 0.0000 } { \
    psfxxx_16_pi/psfop/deadline_south_re_1 

答え3

awkがそうするなら:

awk '/psfxxx_16_pi/{prev = "#" prev} {print prev} {prev = $0} END {print}'

prevここでは、各行ごとに前の行(に保存)を印刷し、$0次の繰り返しのために保存しますprev。行が一致する場合は、末尾に.を追加して最後の行を印刷します#prev

関連情報