如何删除图案之间的线条,但保持第二个图案的线条

时间:2013-12-18 10:32:58

标签: sed

我想删除两个模式之间的线,但保持第二个模式的线。例如,对于使用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.incllink2.inc都是相同的。

你可以帮忙吗?谢谢

3 个答案:

答案 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