4

我想删除文件中的所有空段

空段可以由一对以 开头START和结尾的连续行指定END。有效段将在以 START 开头和以 END 结尾的行之间包含一些内容

样本输入

Header

START arguments
END

Any contents

START arguments
...
something
...
END

Footer

期望的输出

Header


Any contents

START arguments
...
something
...
END

Footer

在这里,我正在寻找可能的一个班轮。任何帮助,将不胜感激。

试验

我试过以下awk。它在某种程度上有效,但即使在有效段中也会删除 START 行。

awk '/^START/ && getline && /^END$/ {next} 1' file
4

6 回答 6

4
perl -00 -pe 's/START .*?\nEND//g' file

这是一个更好的。如果它们没有被空行分隔,我之前给出的解决方案将丢弃整个段落。

之前的回复如下:

这个 perl one 班轮怎么样?

perl -00 -ne 'print if not /START .*\nEND/' file

以段落模式读入文件并丢弃匹配的行START <string><newline>END

于 2013-11-12T20:07:40.103 回答
3

同时人们提出了很好的解决方案,我想出了替代解决方案sed

sed '/^START/N;/^START.*END$/d' file

或者按照@jthill的建议

sed '/^START/N; /\nEND$/d' file
于 2013-11-12T20:40:47.010 回答
2

也许以下内容会有所帮助:

perl -ne 'print /^START/?do{$x=<>;$_,$x if $x!~/^END/}:$_' inFile

数据集上的输出:

Header


Any contents

START arguments
...
something
...
END

Footer
于 2013-11-12T20:02:15.170 回答
2

awk -v RS='START[^\n]*\nEND\n' '{printf "%s", $0}' file.txt
于 2013-11-12T20:10:11.127 回答
1
/^START/ {
    startline=$0

    next
}

/^END$/ && startline {
    startline=""
    next
}

startline {
    print startline
}

startline=""

1
于 2013-11-12T20:05:33.053 回答
1
$ awk '{rec = rec $0 RS} END{ gsub(/START[^\n]*\nEND\n/,"",rec); printf "%s", rec }' file
Header


Any contents

START arguments
...
something
...
END

Footer
于 2013-11-12T21:19:56.880 回答