如何用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
相关产品推荐
相关产品推荐

