使用单行命令删除多行模式

时间:2013-11-12 19:36:19

标签: perl sed awk grep

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

空段可以由一对以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

6 个答案:

答案 0 :(得分:3)

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

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

下面的早期回复:

这个perl one liner怎么样?

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

段落模式下的读入文件并丢弃与START <string><newline>END

匹配的行

答案 1 :(得分:3)

与此同时,人们提出了很好的解决方案,我使用sed

提出了替代解决方案
sed '/^START/N;/^START.*END$/d' file

或者按照 @jthill

的建议
sed '/^START/N; /\nEND$/d' file

答案 2 :(得分:2)

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

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

数据集输出:

Header


Any contents

START arguments
...
something
...
END

Footer

答案 3 :(得分:2)

awk -v RS='START[^\n]*\nEND\n' '{printf "%s", $0}' file.txt

答案 4 :(得分:1)

/^START/ {
    startline=$0

    next
}

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

startline {
    print startline
}

startline=""

1

答案 5 :(得分: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