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

sed或awk删除模式匹配之间的行,不包括第二个标记的行,sed,awk,Sed,Awk,我有一个sed命令,它将成功打印匹配两种模式的行: sed -n '/PAGE 2/,/\x0c/p' filename.txt 我没有弄明白的是,我希望它打印从第一个令牌到第二个令牌的所有行。\x0c标记是大平面文件上的记录分隔符,我需要保持该行的完整性 在这两个令牌之间,数据是完全可变的,我没有可靠的锚 [澄清] 现在,它将打印/PAGE 2/和/\x0c/之间的所有行。我希望它打印/PAGE 2/直到记录中的下一个/\x0c/为止 ^L20-SEP-2006 01:54:08 PM

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

 sed -n '/PAGE 2/,/\x0c/p' filename.txt
我没有弄明白的是,我希望它打印从第一个令牌到第二个令牌的所有行。\x0c标记是大平面文件上的记录分隔符,我需要保持该行的完整性

在这两个令牌之间,数据是完全可变的,我没有可靠的锚

[澄清] 现在,它将打印/PAGE 2/和/\x0c/之间的所有行。我希望它打印/PAGE 2/直到记录中的下一个/\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
[测试数据]/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 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/token和/x0c/token

[解决方案]:


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

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


花括号中的规则适用于任何包含^L的行,并选择性地忽略它们

我认为这样做可以:

awk '/PAGE 2/{a=1}/\x0c/{a=0}{if(a)print}'
在这一行中,第二个sed删除最后一行$

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

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

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

如果文件中有控件Ls分隔记录,并且希望打印特定记录中的特定行,只需将记录分隔符设置为control-L,将字段分隔符设置为\n并打印所需内容即可。例如,要从他发布的输入中获得OP所希望的输出,只需:

awk -v RS='^L' -F'\n' 'NR==3{print $1}' file
^这里显示的L表示一个文本控件L,它是第三条记录,因为在输入文件中第一个控件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
awk 'f;/pattern/{f=1}' file
awk 'c&&!--c;/pattern/{c=N}' file
awk 'c&&!--c{next}/pattern/{c=N}1' file
awk 'c&&c--;/pattern/{c=N}' file
awk 'c&&c--{next}/pattern/{c=N}1' file
awk '/pattern/{c=N}c&&c--' file
b按某种模式打印所有记录:

awk '/pattern/{f=1}f' file
awk 'f;/pattern/{f=1}' file
awk 'c&&!--c;/pattern/{c=N}' file
awk 'c&&!--c{next}/pattern/{c=N}1' file
awk 'c&&c--;/pattern/{c=N}' file
awk 'c&&c--{next}/pattern/{c=N}1' file
awk '/pattern/{c=N}c&&c--' file
c在某些模式后打印第n条记录:

awk '/pattern/{f=1}f' file
awk 'f;/pattern/{f=1}' file
awk 'c&&!--c;/pattern/{c=N}' file
awk 'c&&!--c{next}/pattern/{c=N}1' file
awk 'c&&c--;/pattern/{c=N}' file
awk 'c&&c--{next}/pattern/{c=N}1' file
awk '/pattern/{c=N}c&&c--' file
d打印除第n条记录外的每条记录,打印模式如下:

awk '/pattern/{f=1}f' file
awk 'f;/pattern/{f=1}' file
awk 'c&&!--c;/pattern/{c=N}' file
awk 'c&&!--c{next}/pattern/{c=N}1' file
awk 'c&&c--;/pattern/{c=N}' file
awk 'c&&c--{next}/pattern/{c=N}1' file
awk '/pattern/{c=N}c&&c--' file
e在某种模式后打印N条记录:

awk '/pattern/{f=1}f' file
awk 'f;/pattern/{f=1}' file
awk 'c&&!--c;/pattern/{c=N}' file
awk 'c&&!--c{next}/pattern/{c=N}1' file
awk 'c&&c--;/pattern/{c=N}' file
awk 'c&&c--{next}/pattern/{c=N}1' file
awk '/pattern/{c=N}c&&c--' file
f打印除N条记录外的每条记录,打印模式如下:

awk '/pattern/{f=1}f' file
awk 'f;/pattern/{f=1}' file
awk 'c&&!--c;/pattern/{c=N}' file
awk 'c&&!--c{next}/pattern/{c=N}1' file
awk 'c&&c--;/pattern/{c=N}' file
awk 'c&&c--{next}/pattern/{c=N}1' file
awk '/pattern/{c=N}c&&c--' file
g从某种模式打印N条记录:

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

在适当的情况下,我将变量名从f for find更改为c for count,因为这更能表达变量的实际含义。

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


我不明白你的问题。你使用的rage应该打印起始行和结束行之间的所有行。我不希望它打印结束行。如果你想删除你问题中提到的行,你应该使用d命令,而不是p和-nMy的最终目标是删除,但我需要先获得匹配的部分,因此我要打印。我快到我需要的地方了,完成后会修好的。啊!当你真的有一个不同的问题时,你为什么要求我们解决一个问题?请发布您真正想要做的事情,包括示例输入和预期输出。此解决方案更好,但它也忽略了打印第一个令牌行。我确实需要点击那一行。添加了测试数据以使其更简洁。@avgvstvs,如果这忽略了打印第一个标记的行,这是否意味着匹配第一个标记的行也匹配第二个标记?抱歉,根据发布的测试数据,它错误地删除了我怀疑的第一行,因为{/\x0c/!p}子句查找第一行将包含的任何换行符。因此,输出会剥离第一行和最后一行,并保留其他所有内容。正确的命令是sed'/PAGE[2-9]/,/\x0c/{/\x0c$/!d},这不会从所有输出中删除最后一行,而不是从每个输出块中删除最后一行吗?您需要使用| sed'/^STOP$/d'或类似命令。这将删除第一个sed中的最后一行,但不在匹配空间内。我发布了一些测试数据。