我有一个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
并且有选择地忽略它们.
编辑: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"为"计数"在适当情况下为这更多表现的是什么变量实际上是.