如何用sed/awk提取从指定文本到第二个空行的内容?
用sed/awk提取从指定开头到第二个空行的内容(支持多次匹配)
需求说明
从文件中提取所有以pattern1:开头的内容块,每个块持续到第二个空行为止,原文件中该模式可能重复出现,所有匹配的块都需要保留。
示例输入
pattern1: text1 text2 text3 pattern1: text4 text5 text6 another text pattern1 more text
期望输出
pattern1: text1 text2 pattern1: text4 text5
问题分析
- 你之前用的
sed -n '/^pattern/,/^$/p' filename只能提取到第一个空行,因为sed的区间匹配是从起始模式行到第一个匹配结束模式的行,无法识别第二个空行。 - 尝试的awk命令逻辑有误,区间匹配和计数器的结合方式不对,导致无法正确触发停止条件。
解决方案
方法1:awk(推荐,逻辑清晰)
awk '/^pattern1:/ {flag=1; cnt=0} flag {print; if (/^$/) cnt++; if (cnt==2) flag=0}' filename
逻辑说明:
- 匹配到
pattern1:开头的行时,开启打印标记flag=1,同时重置空行计数器cnt=0 - 只要
flag为1,就打印当前行 - 每遇到空行,计数器
cnt加1 - 当
cnt达到2时,关闭打印标记,直到下一次匹配到起始模式
方法2:sed
sed -n ' /^pattern1:/ { :loop p n /^$/ { p n /^$/ !b loop } } ' filename
逻辑说明:
- 匹配到
pattern1:开头的行后,进入循环 - 打印当前行,读取下一行
- 遇到第一个空行时,打印它并读取下一行
- 如果下一行不是空行,继续循环打印;如果是空行,就停止当前块的处理,等待下一个起始模式
内容的提问来源于stack exchange,提问作者Qunoot K
相关产品推荐
相关产品推荐

