我想删除两个模式之间的线,但保持第二个模式的线。例如,对于使用MATER / 4401001 302
和/
作为模式的文件:
$# IDMAT MATYP RHO ISINT ISHG ISTRAT IFROZ
MATER / 4401001 302 0 0 0
$# BLANK QVM IDMPD
0
$# TITLE
NAME PLINK Material
$# SLFACM FSNVL DELTNL STNOR STTAN IFLGC BLANK TLSTIF
0.1 0
$# I3DOF TOLCOR IDRUP
0 1. 0
$---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
$# IDMAT MATYP RHO ISINT ISHG ISTRAT IFROZ
MATER / 4401005 103 2.753E-6 0 4
我想得到:
$# IDMAT MATYP RHO ISINT ISHG ISTRAT IFROZ
MATER / 4401005 103 2.753E-6 0 4
我尝试使用以下代码进行操作:
awk 'BEGIN{p=1} /MATER \/ 4401001/ {p=0} /\// {p=1} p' llink1.inc > llink2.inc
但它在我的CentOS上不起作用 - 文件llink1.inc
和llink2.inc
都是相同的。
答案 0 :(得分:5)
sed 行已关闭:
sed '/line 1/,/line 2/{/line 2/!d}' file
测试
kent$ echo "bla bla
line 1
bla bla
gov gov
line 2
bla bla
bla bla"|sed '/line 1/,/line 2/{/line 2/!d}'
bla bla
line 2
bla bla
bla bla
与 awk 相同的想法:(适用于相关示例)
awk '/line 1/,/line 2/{if(!/line 2/)next}7' file
同样的例子:
kent$ (master|✚9) echo "bla bla
line 1
bla bla
gov gov
line 2
bla bla
bla bla"|awk '/line 1/,/line 2/{if(!/line 2/)next}7'
bla bla
line 2
bla bla
bla bla
答案 1 :(得分:2)
如果可以awk
,这可以是一种方式:
$ awk 'BEGIN{p=1} /line 1/ {p=0} /line 2/ {p=1} p' file
bla bla
line 2
bla bla
bla bla
使用p
打印标记时,在找到line 1
时取消设置并在line 2
出现时再次设置。
要确保我们正在打印的行是正确的,请说:
$ cat a
1bla bla
line 1
2bla bla
3gov gov
line 2
4bla bla
5bla bla
$ awk 'BEGIN{p=1} /line 1/ {p=0} /line 2/ {p=1} p' a
1bla bla
line 2
4bla bla
5bla bla
鉴于您的新示例输入,这对我有用:
$ awk 'BEGIN{p=1} /MATER \/ 4401001/ {p=0; next} /\// {p=1} p' file
$# IDMAT MATYP RHO ISINT ISHG ISTRAT IFROZ
MATER / 4401005 103 2.753E-6 0 4
答案 2 :(得分:0)
简短awk
awk '/line 1/ {f=1} /line 2/ {f=0} !f' file
bla bla
line 2
bla bla
bla bla
更短,但不健壮。
awk '/line/ {f=!f} !f' file