如何用sed结合正则实现Markdown标题首尾等号对应替换
用sed转换Markdown标题格式
要实现将行首#标记的标题转换为首尾对应数量=包裹的格式,可借助GNU sed的保持空间(hold space)完成,核心逻辑是先捕获开头#的数量,转换为对应数量的=后,再拼接回标题首尾。
单文件处理命令
sed -E ' /^#/{ h s/^(#+).*/\1/ s/#/=/g G s/(=+)\n(#+)( .*)/\1 \3 \1/ }' your_file.md
批量处理多个Markdown文件(带备份)
sed -i.bak -E ' /^#/{ h s/^(#+).*/\1/ s/#/=/g G s/(=+)\n(#+)( .*)/\1 \3 \1/ }' *.md
命令拆解
/^#/:仅匹配以#开头的标题行h:把当前完整标题行存入保持空间暂存s/^(#+).*/\1/:在模式空间中只保留开头的#序列s/#/=/g:将所有#替换为=,得到与原#数量一致的=字符串G:把保持空间里的原标题行追加到模式空间,此时结构为====\n#### Heading 4s/(=+)\n(#+)( .*)/\1 \3 \1/:将=序列、标题内容拼接成==== Heading 4 ====的最终格式
注意事项
- 该命令依赖GNU sed(Linux系统默认自带,macOS需安装GNU sed并使用
gsed命令) -i.bak会为原文件生成.bak后缀的备份,无需备份可直接用-i参数
内容的提问来源于stack exchange,提问作者David Savage
相关产品推荐
相关产品推荐

