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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:44:57