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

如何使用sed实现多行替换 完成Markdown代码块转LaTeX

sed实现Markdown代码块转LaTeX lstlisting环境方案

原命令失效的核心原因是sed默认运行在单行处理模式,正则匹配不会跨换行识别被代码内容分隔的两组三反引号标记,自然无法完成替换。

奇偶次匹配替换三反引号的方案完全可行,不需要修改Markdown语法用4个反引号标记结尾,纯sed即可实现符合CommonMark规范的转换:

  • 基础版(仅转换无语言标识的代码块,匹配单独成行的三反引号边界)
sed -E '
/^```$/ {
    x
    s/^/flag/
    /^flag$/ {
        s/^.*$/\\begin{lstlisting}/
        b
    }
    s/^.*$/\\end{lstlisting}/
    x
    d
}
' your_markdown_file.md

实现逻辑:

  1. 匹配到单独占一整行的三反引号时,切换到保持空间操作标记位
  2. 第一次命中三反引号(代码块起始位置),标记位初始为空,写入标记后匹配起始规则,将当前行替换为\begin{lstlisting}后直接输出,进入下一轮循环
  3. 第二次命中三反引号(代码块结束位置),标记位已存在写入内容,匹配结束规则,将当前行替换为\end{lstlisting},清空标记位后输出
  4. 所有非三反引号边界的普通行直接正常输出,不会被改动

如果需要支持三反引号后带语言标识的写法(如```python),可以在基础版的起始匹配逻辑中,提取反引号后的字符串,拼接到\begin{lstlisting}的language参数位置即可。
该实现不会误判行内代码的反引号标记,也不需要修改原始Markdown内容的写法,完全适配标准Markdown的代码块规则。如果文档存在嵌套三反引号的特殊场景,可以在标记位判断逻辑中增加深度计数,常规技术文档场景下上述奇偶判断逻辑已经足够覆盖需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:06:21