如何从Unix中的文件中删除一组行

时间:2013-02-23 13:19:31

标签: bash shell unix sed awk

我有一个像这样的示例文件。

[unit id="20"]
...blah blah...
[/unit]
[unit id="AB 560"]
...
[/unit]
[unit id="205"]
...
[/unit]
[unit id="AB 580"]
...
[/unit]
[unit id="120"]
...
[/unit]
[unit id="AB 210"]
...
[/unit]

我想删除包含字符串“AB”的行和其后的10行。具体而言,[unit ...][/unit]之间将有10行。输出文件应如下所示:

[unit id="20"]
...blah blah...
[/unit]
[unit id="205"]
...
[/unit]
[unit id="120"]
...
[/unit]

注意:只会出现“AB”。没有其他字符/字符串。我需要一个可执行的unix shell脚本 - 请不要Perl。

2 个答案:

答案 0 :(得分:4)

您只需找到AB,然后删除此行以及其后的10行。正如@Lev Levitsky指出的那样,GNU sed仅允许这样做:

sed '/AB/,+10 {d}' <infile>

如果要将修改应用于给定文件,只需添加标记-i即可进行就地替换。请注意,正如@Jens所指出的,这是一个GNU ism:

sed -i '/AB/,+10 {d}' <infile>

答案 1 :(得分:1)

您可能更愿意根据模式进行,而不仅仅是+ 10lines

perl -n -e 'unless(/^\[unit.*AB.*\]/../\[\/unit\]/) { print; }'  tx

tx文件是

[unit id="20"]
20...blah blah...
[/unit]
[unit id="AB 560"]
AB...
[/unit]
[unit id="205"]
205 ...
[/unit]
[unit id="AB 580"]
AB...
[/unit]
[unit id="120"]
120...
[/unit]
[unit id="AB 210"]
AB...
[/unit]

给出

[unit id="20"]
20...blah blah...
[/unit]
[unit id="205"]
205 ...
[/unit]
[unit id="120"]
120...
[/unit]