You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

逻辑说明:

  1. 匹配到pattern1:开头的行时,开启打印标记flag=1,同时重置空行计数器cnt=0
  2. 只要flag为1,就打印当前行
  3. 每遇到空行,计数器cnt加1
  4. 当cnt达到2时,关闭打印标记,直到下一次匹配到起始模式

方法2:sed

sed -n '
/^pattern1:/ {
    :loop
    p
    n
    /^$/ {
        p
        n
        /^$/ !b loop
    }
}
' filename

逻辑说明:

  1. 匹配到pattern1:开头的行后,进入循环
  2. 打印当前行,读取下一行
  3. 遇到第一个空行时,打印它并读取下一行
  4. 如果下一行不是空行,继续循环打印;如果是空行,就停止当前块的处理,等待下一个起始模式

内容的提问来源于stack exchange,提问作者Qunoot K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 07:47:07