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

avg*_*tvs 0 awk sed

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

 sed -n '/PAGE 2/,/\x0c/p' filename.txt
Run Code Online (Sandbox Code Playgroud)

我没想到的是,我希望它能够打印第一个令牌中的所有行,直到第二个令牌.该\x0c令牌是在一个大平面文件记录分隔符,我需要保持该行不变.

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

[澄清]现在它打印所有行/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
Run Code Online (Sandbox Code Playgroud)

[预期结果]

 ^L20-SEP-2006 01:54:08 PM         Foobars College                          PAGE 1
Run Code Online (Sandbox Code Playgroud)

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

[解]:

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

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

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

Ed *_*ton 9

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

给定一个带有control-Ls分隔记录的文件,并希望打印特定记录中的特定行,只需将记录分隔符设置为control-L,将字段分隔符设置为"\n",然后打印任何您喜欢的内容.例如,要获得输出,OP表示他希望从他发布的输入中只是:

awk -v RS='^L' -F'\n' 'NR==3{print $1}' file
Run Code Online (Sandbox Code Playgroud)

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

#

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

你要这个:

awk '/PAGE 2/ {f=1} /\x0c/{f=0} f' file
Run Code Online (Sandbox Code Playgroud)

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

awk '/PAGE 2/ {f=1} f; /\x0c/{f=0}' file
awk 'f; /PAGE 2/ {f=1} /\x0c/{f=0}' file
Run Code Online (Sandbox Code Playgroud)

最后,仅供参考,以下成语描述了如何在给定特定模式匹配的情况下选择一系列记录:

a)从某种模式打印所有记录:

awk '/pattern/{f=1}f' file
Run Code Online (Sandbox Code Playgroud)

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

awk 'f;/pattern/{f=1}' file
Run Code Online (Sandbox Code Playgroud)

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

awk 'c&&!--c;/pattern/{c=N}' file
Run Code Online (Sandbox Code Playgroud)

d)打印每条记录后,除了一些模式的第N个记录:

awk 'c&&!--c{next}/pattern/{c=N}1' file
Run Code Online (Sandbox Code Playgroud)

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

awk 'c&&c--;/pattern/{c=N}' file
Run Code Online (Sandbox Code Playgroud)

F)打印后,除了一些模式的N条记录每一条记录:

awk 'c&&c--{next}/pattern/{c=N}1' file
Run Code Online (Sandbox Code Playgroud)

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

awk '/pattern/{c=N}c&&c--' file
Run Code Online (Sandbox Code Playgroud)

我从"F"改为变量名的"发现",以"C"为"计数"在适当情况下为这更多表现的是什么变量实际上是.