1

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

[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 ...]具体来说,和之间将有 10 行[/unit]。输出文件应如下所示:

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

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

4

2 回答 2

4

您可以简单地找到AB,然后删除该行及其后面的 10 行。正如@Lev Levitsky 所指出的,这GNU sed仅允许:

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

如果您想将修改应用于给定文件,只需添加标志-i, 以进行就地替换。请注意,正如@Jens 所指出的,这是一个GNU主义:

sed -i '/AB/,+10 {d}' <infile>
于 2013-02-23T13:29:51.703 回答
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]
于 2013-02-23T13:51:09.397 回答