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

Bash脚本中使用Sed添加LaTeX代码时的反斜杠转义问题

解决Bash脚本中sed添加LaTeX代码的转义问题

问题背景

需要在LaTeX代码的\usepackage[french]{babel}行之后,新增一行LaTeX代码:

\addto\captionsfrench{\def\tablename{Tableau}}

编写的Bash脚本遇到转义问题:

  • 若设置newString='\addto\captionsfrench{\def\tablename{Tableau}}',执行后\addto前的反斜杠会丢失
  • 若转义反斜杠为\\addto,会出现^Gaddto(\a被bash解析为响铃控制字符)

解决方案

方法1:双重转义反斜杠

由于bash和sed都会解析反斜杠,需要对每个反斜杠做两次转义(bash解析一次后,剩下的一次给sed):

#!/bin/bash
newString='\\\\addto\\\\captionsfrench{\\\\def\\\\tablename{Tableau}}'
sed -i "/babel.*/a $newString" "$1"

方法2:用ASCII码表示反斜杠

直接用\x5c(反斜杠的ASCII十六进制码)代替反斜杠,避免转义混乱:

#!/bin/bash
sed -i "/babel.*/a \x5caddto\x5ccaptionsfrench{\x5cdef\x5ctablename{Tableau}}" "$1"

方法3:使用Here-Doc传递内容

通过here-doc直接把要添加的代码传给sed,完全绕开转义问题(注意EOF要用单引号包裹,防止bash解析内部的反斜杠):

#!/bin/bash
sed -i '/babel.*/r /dev/stdin' "$1" << 'EOF'
\addto\captionsfrench{\def\tablename{Tableau}}
EOF

问题原因

  • 单引号包裹的字符串中,bash仅会转义单引号,其他反斜杠会原封不动传给sed,但sed会把反斜杠当成特殊字符处理,导致丢失
  • 双引号包裹的字符串中,bash会解析转义序列(比如\a会变成响铃字符^G),所以必须额外转义反斜杠,让bash将其识别为普通字符后再传给sed

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 21:47:20