首页 > 解决方案 > 提取模式之间的内容

问题描述

在 SUSE Linux 上,我想从文本文件中找到 BEGIN 字符串和 END 字符串之间的完整部分。我考虑过使用 sed 或 awk。

或者,我想在另一次运行中搜索下一次出现。

我的挑战是:

例子

something before ----BEGIN
first paragraph
Text Text Text
Text Text Text
Text Text Text
no ending pattern

something before ----BEGIN
second paragraph
Text Text Text
Text Text Text
Text Text Text
END---- some more text

no beginning pattern
Text Text Text
Text Text Text
END---- some more text

something before ----BEGIN
third paragraph
Text Text Text
Text Text Text
Text Text Text
no ending pattern

something before ----BEGIN
fourth paragraph
Text Text Text
Text Text Text
Text Text Text
END---- some more text

Text Text Text

我期待这样的事情:

----BEGIN
second paragraph
Text Text Text
Text Text Text
Text Text Text
END----

在另一次运行中,我想找到下一个完整部分:

----BEGIN
fourth paragraph
Text Text Text
Text Text Text
Text Text Text
END----

在论坛中,我已经可以找到这样的东西:

tac < file.txt | sed  '/END-----/,$!d;/-----BEGIN/q' | tac

但它只找到最后一次出现,并且不会剪切开头和结尾的字符。

不幸的是,我在使用 sed/awk 或正则表达式方面经验不足。如果您能给我一些指导,我将不胜感激!

干杯,呃

标签: regexlinuxshellawksed

解决方案


$ cat tst.awk
BEGIN { beg="----BEGIN"; end="END----" }
sub(".*"beg,beg) { inBlock=1; buf="" }
inBlock {
    buf = buf $0 ORS
    if ( sub(end".*",end,buf) ) {
        print buf ORS
        inBlock=0
    }
}

$ awk -f tst.awk file
----BEGIN
second paragraph
Text Text Text
Text Text Text
Text Text Text
END----

----BEGIN
fourth paragraph
Text Text Text
Text Text Text
Text Text Text
END----

推荐阅读