sed或awk删除模式匹配之间的行,不包括第二个标记的行

时间:2012-11-01 13:07:34

标签: sed awk

我有一个sed命令可以成功打印匹配两种模式的行:

 sed -n '/PAGE 2/,/\x0c/p' filename.txt

我还没想到的是,我希望它打印第一个令牌中的所有行,向上直到第二个令牌。 \x0c令牌是大平面文件上的记录分隔符,我需要保持THAT行完好无损。

在两个令牌之间,数据是完全可变的,我没有可靠的锚点可以使用。

[澄清] 现在它打印/PAGE 2//\x0c/之间的所有行。我希望它打印/PAGE 2/直到记录中的下一个/\x0c/

[测试数据] /x0c将位于第一行的开头,以及此记录的最后一行的开头。

我需要通过下一条记录开头之前的行删除记录的第一行。

^L20-SEP-2006 01:54:08 PM         Foobars College                          PAGE 2
TERM: 200610               Student Billing Statement                     SUMDATA
99999

Foo bar                                                              R0000000
999 Geese Rural Drive                                           DUE: 15-OCT-2012
Columbus, NE 90210

--------------------------------------------------------------------------------
       Balance equal to or greater than $5000.00    $200.00
       Billing inquiries may be directed to 444/555-1212 or by
       email to bursar@foobar.edu.  Financial Aid inquiries should
       be directed to 444/555-1212 or finaid@foobar.edu.
^L20-SEP-2006 01:54:08 PM         Foobars College                          PAGE 1

[预期结果]

 ^L20-SEP-2006 01:54:08 PM         Foobars College                          PAGE 1

文件中会有多个这样的记录。我只能依赖/PAGE 2/令牌和/x0c/令牌。

[溶液]:

在Choruba的带领下,我编辑了他的命令:

sed '/PAGE [2-9]/,/\x0c/{/\x0c$/!d}'

大括号中的规则将自身应用于包含^L任何行,并有选择地忽略它们。

5 个答案:

答案 0 :(得分:9)

编辑:OP提出的新问题的新答案(如何删除记录:

如果文件具有control-Ls分隔记录并希望从特定记录打印特定行,只需将记录分隔符设置为control-L,将字段分隔符设置为“\ n”并打印任何您喜欢的内容。例如,要获得输出,OP表示他希望从他发布的输入中得到:

awk -v RS='^L' -F'\n' 'NR==3{print $1}' file
此处显示的

^ L表示文字控件-L,它是第3条记录,因为在输入文件中第一个控件-L之前有一条空记录。

这是OP提出的原始问题的答案:

你想要这个:

awk '/PAGE 2/ {f=1} /\x0c/{f=0} f' file

但也尝试这些以查看差异(未来):

awk '/PAGE 2/ {f=1} f; /\x0c/{f=0}' file
awk 'f; /PAGE 2/ {f=1} /\x0c/{f=0}' file

最后,仅供参考,以下成语描述了如何根据特定模式选择一系列记录:

a)打印某些模式的所有记录:

awk '/pattern/{f=1}f' file

b)在某种模式之后打印所有记录:

awk 'f;/pattern/{f=1}' file

c)在某种模式后打印第N条记录:

awk 'c&&!--c;/pattern/{c=N}' file

d)在某种模式之后打印除第N条记录以外的所有记录:

awk 'c&&!--c{next}/pattern/{c=N}1' file

e)在某种模式之后打印N条记录:

awk 'c&&c--;/pattern/{c=N}' file

f)在某种模式之后打印除N条记录之外的所有记录:

awk 'c&&c--{next}/pattern/{c=N}1' file

g)从某种模式打印N条记录:

awk '/pattern/{c=N}c&&c--' file

我将变量名称从“f”变为“found”变为“c”变为“count”,因为它更能表达变量实际上是什么。

答案 1 :(得分:3)

告诉sed不要打印包含字符的行:

sed -n '/PAGE 2/,/\x0c/{/\x0c/!p}' filename.txt

答案 2 :(得分:1)

我认为这样做会:

awk '/PAGE 2/{a=1}/\x0c/{a=0}{if(a)print}'

答案 3 :(得分:0)

在此行中,第二个sed删除(d)最后一行($)。

sed -n '/^START$/,/^STOP$/p' in.txt | sed '$d'

答案 4 :(得分:0)

在Choruba的带领下,我编辑了他的命令:

sed '/PAGE [2-9]/,/\x0c/{/\x0c$/!d}'