我有一个充满记录的文件......每条记录长34行。
我需要清除第一行记录与字符串匹配的任何记录的此文件。 第一行是位置代码。必须清除文件来自特定位置的所有记录。在每条记录的第一行之后有一个空行...实际上有几行,但是,任何出现空行都表示该记录属于该位置。
所以 -
如果行匹配 而下一行是空白的 然后删除行后的行+33行。
更喜欢bash解决方案,因为这是我最熟悉的,但perl还可以。
有些人要求提供样本(此记录在现实生活中为34行):
LOCATION
DARRYL MITHRANDIR
5 LONGBOTTOM LEAF LN
HOBBITON, ME 99999
We rang to notify you that we have the following items:
1 blade - glamdring = $1,000
1 shrunken troll head = $1
Available for pick-up at the following location:
LOCATION
8 SMAUG LN
MORDOR, ME 99998
如您所见,位置始终作为记录中的第一行,后跟一系列空行。它出现在记录的其他地方,但后面跟着一行表示街道地址的文本。
答案 0 :(得分:4)
嗯,这是awk
的回答。将LOCATION
更改为适合您的匹配的正则表达式。
awk '/LOCATION/{l=$0;getline;if(!$0)i=33; else print l}i{if(--i);next}1'
$ cat ./input
LOCATION ### DELETE THIS RECORD ###
DARRYL MITHRANDIR
5 LONGBOTTOM LEAF LN
HOBBITON, ME 99999
We rang to notify you that we have the following items:
1 blade - glamdring = $1,000
1 shrunken troll head = $1
Available for pick-up at the following location:
CHUCKS AMAZING BARGAINS
8 SMAUG LN
MORDOR, ME 99998
LOCATION ### DONT DELETE THIS RECORD, NEXT LINE NOT BLANK ###
FOO BAR
31337 EXAMPLE WAY
EXAMPLETON, EX 12345
We rang to notify you that we have the following items:
1 ring of awkfu = $99,000,000
1 troll face = jelly?
Available for pick-up at the following location:
SIEGEXS AMAZING EXAMPLES
314159 PI CIRCLE
NOWHERE, NA 00000
$ awk '/LOCATION/{l=$0;getline;if(!$0)i=17; else print l}i{if(--i);next}1' ./input
LOCATION ### DONT DELETE THIS RECORD, NEXT LINE NOT BLANK ###
FOO BAR
31337 EXAMPLE WAY
EXAMPLETON, EX 12345
We rang to notify you that we have the following items:
1 ring of awkfu = $99,000,000
1 troll face = jelly?
Available for pick-up at the following location:
SIEGEXS AMAZING EXAMPLES
314159 PI CIRCLE
NOWHERE, NA 00000
答案 1 :(得分:2)
这可能对您有用:
sed -i '/LOCATION/{N;/\n$/{:a;N;x;s/^/X/;/^X\{32\}/{g;d};x;ba}}' file
根据说明:
如果行匹配且下一行为空,则删除行后的行+33行。
说明:
LOCATION
N
:a
N
x
X
附加到HS s/^/X/
X
的{{1}}匹配
/^X\{32\}/
g
d
x
答案 2 :(得分:1)
您可以使用awk
-
awk '/YOUR PATTERN/ {
i=$0;getline; if($0~/^$/)
for(i=1;i<34;i++) {getline} else {print i,$0;next}}1' file
i
中。 getline
关键字检查下一行,如果是blank line
我们向下移动33次。 i
。1
用于打印与图案不匹配的所有行。