使用Awk提取从`* foo`到下一个`* `开头行的内容遇问题
提取Org模式文件指定标题下的内容
问题描述
需要提取文件中从* foo开头的行开始,到下一个一级标题(以* 开头的行)之前的所有内容。尝试执行命令:
awk '/^\* foo/,/^\* /' file.org
但仅输出首行* foo。示例Org文件内容如下:
* foo ** subheading - item 1 - item2 comments * bar ** subheading more text
问题原因
原命令的范围模式/^\* foo/,/^\* /存在逻辑问题:* foo这一行本身就匹配结束条件/^\* /(行首是*加空格),导致awk认为范围在第一行就结束了,因此只输出该行。
正确实现方法
方法1:变量控制输出范围
通过标记变量flag精准控制输出的开始与停止,避免起始行触发结束条件:
/^\* foo/ { flag = 1 } flag { print # 匹配到其他一级标题时停止输出 if (/^\* / && $0 !~ /^\* foo/) { flag = 0 } }
直接执行的单行命令:
awk '/^\* foo/{flag=1} flag{print; if(/^\* / && $0!~/^\* foo/) flag=0}' file.org
方法2:匹配下一个一级标题时退出
如果明确知道下一个一级标题是* bar,可以直接匹配该行并退出,效率更高:
awk '/^\* bar/{exit} /^\* foo/||flag{flag=1;print}' file.org
预期输出
执行上述正确命令后,将得到目标内容:
* foo ** subheading - item 1 - item2 comments
内容的提问来源于stack exchange,提问作者Daniel Krajnik
相关产品推荐
相关产品推荐

