如何使用sed结合bash变量替换含反斜杠、花括号的LaTeX内容
LaTeX文件sed文本替换特殊字符处理方案
原有命令的错误点
- 变量赋值不符合bash语法:带空格的字符串如果不加引号,
CASE=Analysis Case 1会被shell解析为「设置临时变量CASE=Analysis,执行名为Case的命令、传入参数1」,根本无法正确赋值。 - 正则转义错误:sed默认正则规则中,
\t会被识别为制表符匹配,你写的\title实际是匹配「制表符+itle字符串」,完全匹配不到LaTeX里的\title命令;要匹配字面意义的反斜杠,需要给反斜杠自身做转义。 - 匹配规则多了冗余空格:原文件待匹配行的
\title{Analysis Case 0}前后没有额外空格,你在匹配模式和替换内容里加的前后空格会导致规则完全命不中目标行。 - 分隔符风险:如果变量内容里包含
/字符,用/做sed的s命令分隔符会直接触发语法错误。
可直接运行的正确命令
固定匹配原标题的精确替换版本
# 带空格的变量值必须用引号包裹 CASE="Analysis Case 1" # 单引号包裹sed正则主体,避开bash对反斜杠的预解析,拼接双引号包裹的变量避免空格拆分 sed -e 's/\\title{Analysis Case 0}/\\title{'"$CASE"'}/g' ./case0.tex > ./case1.tex
通用替换版本(无需提前写死原标题文本)
如果不需要精确匹配原标题内容,只要替换所有\title{}大括号内的文本,可以用这个版本:
CASE="Analysis Case 1" sed -e 's/\\title{.*}/\\title{'"$CASE"'}/g' ./case0.tex > ./case1.tex
执行后输出的case1.tex中,对应行就会是预期的\title{Analysis Case 1}。
注:如果你的CASE变量内容包含
&、\这类sed特殊字符,需要提前做转义处理,普通文本场景上述命令可直接使用。
内容的提问来源于stack exchange,提问作者Kazuma
相关产品推荐
相关产品推荐

