删除匹配的模式PAIR之间的线条

时间:2016-08-30 01:16:45

标签: bash awk sed

我有一个包含一些重复模式的文本文件,我想删除匹配模式的每个匹配之间的行。

问题:"模式行的最后一次出现"是"开放模式"。

示例:

Some lines
In the preamble
START
Some lines       # Remove this
I with to remove # Remove this
STOP             # Remove this
Some lines
I wish to keep
START
Some other lines # Remove this
I with to remove # Remove this
STOP             # Remove this
Some lines
I wish to keep
START
Don't remove this line
Etc.

所以我要删除STARTSTOP之间的所有内容,而不是START

上次发生后的内容

我找到了一些sed和awk的解决方案,如果我的原始文本在最后一个关闭之后没有最后一次出现的开放模式(例如here),那可能对我有用,但是唉并没有解决我的问题。

奖励:理想情况下,我想删除持有结束模式的行,但不删除开放行。这并不重要,因为我可以随时保留两者,然后删​​除结束的那些。

我实际上希望清理一个巨大的pdf文档的书签,这些文档是由几个已经包含多个书签的小文档的串联构建的,只保留每个原始文件的第一个书签。 任何有关替代方案的建议也是受欢迎的。

1 个答案:

答案 0 :(得分:1)

$ awk '/START/,/STOP/{if($0=="START") a=""; else {a=a $0 ORS;next}} {print} END {printf "%s", a}' file
Some lines
In the preamble
START
Some lines
I wish to keep
START
Some lines
I wish to keep
START
Don't remove this line
Etc.

步行得来速:

/START/,/STOP/ {     # between markers
    if($0=="START")  # if START
        a=""         # reset a and print record in the end
    else {
        a=a $0 ORS   # build up a
        next         # skip the print in the end
    }
} 
{
    print            # the print
} 
END {
    printf "%s", a   # in the end print the a
}