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
相关产品推荐
相关产品推荐

