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