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

如何使用sed移除AsciiDoc文件中的可折叠块?

移除AsciiDoc中的可折叠块解决方案

你之前的sed命令失效的原因是:sed默认逐行处理文本,没法直接匹配跨两行的.\n[%collapsible]模式,导致标题行和[%collapsible]行没被正确删除。下面提供几种可行的解决方法:

方法1:使用sed的多行模式(-z选项)

利用sed -z将整个文件作为一个连续的流处理(以NUL字符分隔,而非换行),这样就能匹配跨行的内容:

sed -z 's/\..*\n\[%collapsible\]\n====.*\n====\n//g' input.adoc > output.adoc
  • 正则说明:\..*\n匹配以.开头的标题行和后续换行;\[%collapsible\]\n匹配[%collapsible]行和换行;====.*\n====\n匹配从第一个====到第二个====的整个内容块(包括前后换行);//g表示全局替换为空。

方法2:使用awk处理(更灵活的多行逻辑)

awk天生适合处理多行文本逻辑,脚本如下:

/^\./ {
    getline nextline
    if (nextline ~ /^\[%collapsible\]/) {
        # 跳过可折叠块的内容
        while (getline) {
            if ($0 ~ /^====$/) {
                # 找到第一个====后,继续找闭合的====
                while (getline) {
                    if ($0 ~ /^====$/) break
                }
                break
            }
        }
        next
    } else {
        print $0
        print nextline
    }
}
1

使用方式:

awk -f remove-collapsible.awk input.adoc > output.adoc
  • 逻辑说明:当遇到以.开头的行时,读取下一行判断是否为[%collapsible];如果是,就循环跳过直到找到闭合的====;否则正常打印两行;最后的1表示打印所有未被特殊处理的行。

方法3:使用Perl的多行正则匹配

Perl的正则支持多行模式,能轻松处理跨行块:

perl -0777 -pe 's/\..*\n\[%collapsible\]\n====.*?\n====\n//gs' input.adoc > output.adoc
  • 参数说明:-0777将整个文件读入内存;/s让.匹配换行符;/g全局替换;.*?是非贪婪匹配,确保只匹配到最近的闭合====。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:55:19