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

