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

如何用Shell脚本工具提取正则匹配后至下一个正则匹配前的内容?

问题描述

原始文本内容如下:

[task,line:111] first
                second
[demo,line:222] first
[test,line:333] first
[task,line:444] first
                second
                third
[task,line:555] first

需求是提取所有包含[task]的行,以及该行之后直到出现另一个[*]格式行之前的内容,预期结果如下:

[task,line:111] first
                second
[task,line:444] first
                second
                third
[task,line:555] first

目前仅会使用命令 awk '/regex/{print $0>"'$output'"}' $file 提取匹配行并写入文件,想请教如何用awk或其他Shell脚本工具实现上述需求。

解决方案

用awk可以轻松实现这个需求,核心思路是通过一个标志位控制是否打印行:

awk '/^\[/{flag=($0~/^\[task/)} flag' input.txt > output.txt

命令解释

  • /^\[/: 匹配以[开头的行,这类行是段落的起始标记
  • flag=($0~/^\[task/): 当匹配到以[task开头的行时,把标志位flag设为1(真);如果是其他[*]格式的行,flag设为0(假)
  • flag: 当flag为真时,打印当前行;为假时不打印

这样就能自动打印[task]开头的行,以及后续所有直到下一个[*]行之前的内容。

如果要直接在终端查看结果,去掉输出重定向即可:

awk '/^\[/{flag=($0~/^\[task/)} flag' input.txt

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:06:02