sed:如果找到匹配,则替换上一行中的部分文本

sed:如果找到匹配,则替换上一行中的部分文本

我想create_test在文件中替换为#create_test如果下一行包含psfxxx_16_pi.我该如何使用 sed 来处理包含此内容的整个文件?

输入文件内容:

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.最后,打印最后一行。

相关内容