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

如何用Bash工具将LaTeX中连续\_替换为对应长度的\rule命令

替换TeX文件中连续下划线为LaTeX规则命令

需求说明

用pandoc将.docx转成.tex后,原文档的填空下划线被转为连续的\_,这些下划线存在间隙且长度不符合需求。需要将任意长度的连续\_替换为\rule[-0.1ex]{N em}{0.5pt},其中N是连续\_的数量。

解决方案

方法1:使用awk处理

awk适合这类需要计算匹配内容长度的替换场景,命令如下:

awk '{
    while (match($0, /(\\_)+/)) {
        n = RLENGTH / 2  # 每个\_占2个字符,计算得到下划线数量N
        replace_str = "\\rule[-0.1ex]{" n "em}{0.5pt}"
        $0 = substr($0, 1, RSTART-1) replace_str substr($0, RSTART+RLENGTH)
    }
    print
}' 你的输入文件.tex > 输出文件.tex

命令解释:

  • match($0, /(\\_)+/):逐行匹配连续的\_序列
  • RLENGTH:返回匹配到的字符串总长度,由于每个\_是2个字符(反斜杠+下划线),除以2得到实际的下划线数量N
  • substr:拼接替换前后的字符串,循环处理直到当前行无匹配的\_序列
  • 最后输出处理后的每一行

方法2:使用Perl处理(更简洁)

Perl的正则支持直接在替换中执行代码,命令更紧凑:

perl -pe 's/(\\_)+/sprintf("\\rule[-0.1ex]{%dem}{0.5pt}", length($&)/2)/ge' 你的输入文件.tex > 输出文件.tex

命令解释:

  • s/(\\_)+/.../ge:g表示全局替换,e表示将替换部分作为Perl代码执行
  • length($&):获取匹配到的字符串总长度,除以2得到下划线数量N
  • sprintf:生成符合要求的LaTeX\rule命令

原尝试命令的问题

你之前的sed命令无法工作的原因:

  1. 基础sed不支持在替换中计算捕获组的长度,没有内置的长度计算函数
  2. 正则表达式写法错误:sed基础版本需要用\(和\)表示捕获组,而非();正确的连续\_匹配正则应为(\\_)+
  3. length(\\1)这种写法sed不支持,无法直接获取捕获组的长度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:35:41