我有一个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
的任何行,并有选择地忽略它们。
答案 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}'