如何打印两个匹配模式间的行(结束模式可选)
解决方案:提取包含完整TAG1-TAG2对的文本块
针对文件中存在无对应TAG2的TAG1的情况,可通过AWK精准提取有完整闭合(从TAG1开始到TAG2结束)的文本块,忽略未闭合的TAG1内容。
示例输入文件(file.txt)
aa TAG1 some right text TAG2 some text2 TAG1 some text3 TAG1 some text4 TAG1 some right text 2 TAG2 some text4 TAG1 some text5 some text6
期望输出
TAG1 some right text TAG2 TAG1 some right text 2 TAG2
AWK命令实现
/TAG1/ { buf = $0 ORS next } buf != "" { buf = buf $0 ORS if (/TAG2/) { printf "%s", buf buf = "" } }
命令说明
- 匹配到
TAG1时,初始化缓冲区buf存入当前行并换行,直接进入下一行处理。 - 缓冲区非空时(已捕获TAG1),将当前行追加到缓冲区。
- 若当前行匹配到
TAG2,打印缓冲区内容并清空,完成一个完整块的提取。 - 未遇到TAG2的TAG1对应的缓冲区内容会被自动丢弃,实现忽略未闭合块的效果。
内容的提问来源于stack exchange,提问作者satya
相关产品推荐
相关产品推荐

