如何使用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
实现逻辑:
- 匹配到单独占一整行的三反引号时,切换到保持空间操作标记位
- 第一次命中三反引号(代码块起始位置),标记位初始为空,写入标记后匹配起始规则,将当前行替换为
\begin{lstlisting}后直接输出,进入下一轮循环 - 第二次命中三反引号(代码块结束位置),标记位已存在写入内容,匹配结束规则,将当前行替换为
\end{lstlisting},清空标记位后输出 - 所有非三反引号边界的普通行直接正常输出,不会被改动
如果需要支持三反引号后带语言标识的写法(如```python),可以在基础版的起始匹配逻辑中,提取反引号后的字符串,拼接到\begin{lstlisting}的language参数位置即可。
该实现不会误判行内代码的反引号标记,也不需要修改原始Markdown内容的写法,完全适配标准Markdown的代码块规则。如果文档存在嵌套三反引号的特殊场景,可以在标记位判断逻辑中增加深度计数,常规技术文档场景下上述奇偶判断逻辑已经足够覆盖需求。
内容的提问来源于stack exchange,提问作者Sebastian Dine
相关产品推荐
相关产品推荐

