0

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

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

我没有想到的是,我希望它打印从第一个标记第二个标记的所有行。\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

[预期结果]

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

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

[解决方案]:

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

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

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

4

5 回答 5

9

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

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

awk -v RS='^L' -F'\n' 'NR==3{print $1}' file

此处显示的 ^L 表示文字 control-L,它是第三条记录,因为在输入文件中第一个 control-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

我将变量名称从“found”的“f”更改为“count”的“c”,因为这更能表达变量的实际含义。

于 2012-11-01T13:21:13.110 回答
3

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

sed -n '/PAGE 2/,/\x0c/{/\x0c/!p}' filename.txt
于 2012-11-01T13:14:21.730 回答
1

我认为这会做到:

awk '/PAGE 2/{a=1}/\x0c/{a=0}{if(a)print}'
于 2012-11-01T13:09:55.167 回答
0

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

sed -n '/^START$/,/^STOP$/p' in.txt | sed '$d'
于 2012-11-01T13:12:49.943 回答
0

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

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

于 2015-01-06T19:17:48.267 回答