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

Sed 如何删除图案之间的线条,但保留第二个图案的线条,sed,Sed,我想删除两个图案之间的线条,但保留第二个图案的线条。例如,对于使用MATER/4401001 302和/作为模式的文件: $# IDMAT MATYP RHO ISINT ISHG ISTRAT IFROZ MATER / 4401001 302 0 0 0 $# BLANK

我想删除两个图案之间的线条,但保留第二个图案的线条。例如,对于使用
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
都是相同的


你能帮忙吗。谢谢

如果可以使用
awk
,这可以是一种方式:

$ awk 'BEGIN{p=1} /line 1/ {p=0} /line 2/ {p=1} p' file
bla bla
line 2 
bla bla 
bla bla
这是一个使用
p
打印标志的问题,在找到
第1行时将其取消设置,并在出现
第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

您的sed线路已接近:

sed '/line 1/,/line 2/{/line 2/!d}' file
试验

与awk的想法相同(适用于所讨论的示例)

同样的例子:

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

短的
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

很高兴读到这一点,@Drago:)注意,如果你的问题解决了,你可以接受答案。如果在模式中有一些特殊字符,你可以添加一些注释如何使用代码。。。例如/。非常感谢。again@Drago为此,您需要退出
/
。例如,
awk'BEGIN{p=1}/\/line 1/{p=0}/line 2/{p=1}p'文件
将使它的起始行是
/line 1
。我在感兴趣的文件(llink.inc)中有这段文本:
aa MATER/4401001 3020$#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
我看不出llink1.inc和llink2.inc之间有什么区别。。。你能帮我进一步吗。我希望这样:
aa MATER/4401005 103 2.753E-6 0 4
谢谢。@Drago请使用此示例输入更新您的问题。在注释中无法看到新行。不幸的是,我在CentOS中的:sed'/line 1/,/line 2/{/line 2/!d}'文件中遇到错误:d:Event not found。使用此awk代码,我也遇到错误:/line:Event not found。您确定在bash下运行了它吗@德拉戈看来
被您的shell扩展,它不应该被扩展。
>echo$0
/bin/tsh
尝试转义
然后,@Drago。或者使用bash。我也在这里遇到错误:f:未找到事件@约特。。。你知道问题的根源吗。谢谢,我不明白为什么这不起作用,在我的Ubuntu 12.10中运行良好。您使用的是什么操作系统?我正在使用CentOS 6.4和tsh。谢谢。这应该可以,因为它的标准命令是try
gawk
mawk
,它可能会有帮助。awk/gawk在我的tcsh中是bot可用的,但它会出现同样的问题,mawk不可用
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