如何用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得到实际的下划线数量Nsubstr:拼接替换前后的字符串,循环处理直到当前行无匹配的\_序列- 最后输出处理后的每一行
方法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得到下划线数量Nsprintf:生成符合要求的LaTeX\rule命令
原尝试命令的问题
你之前的sed命令无法工作的原因:
- 基础sed不支持在替换中计算捕获组的长度,没有内置的长度计算函数
- 正则表达式写法错误:sed基础版本需要用
\(和\)表示捕获组,而非();正确的连续\_匹配正则应为(\\_)+ length(\\1)这种写法sed不支持,无法直接获取捕获组的长度
内容的提问来源于stack exchange,提问作者Photon
相关产品推荐
相关产品推荐

