我对 bash 脚本比较陌生,对 LaTeX 没有经验。我被要求开发一个脚本,将 LaTeX 文档中的便捷快捷方式替换为更繁琐的长格式等价物。
到目前为止,我的方法是将快捷方式和长格式隔离在单独的变量中,然后尝试使用 sed 在文本中替换它们。我在下面附上了简短的示例文件。
由于目前该脚本采用 2 个参数,一个文件 expr 从中检索快捷方式和长格式术语,以及一个应该对其进行适当更改的 infile。我知道该脚本正确隔离了快捷方式和长格式并可以返回它们,但它似乎无法执行 sed 命令。
我试过在网上搜索这个并发现多个类似的问题,其中建议是 sed 难以识别变量并且各种类型的引用组合可能会解决问题。我尝试了许多排列,但似乎都没有。在许多情况下,长格式术语包含特殊字符,例如“$”和“{}”,所以我怀疑这可能是问题,但我不确定。我也非常愿意接受有关如何解决问题的其他想法。请在下面找到脚本和 2 个参数文件 expr 和 infile 的示例。
包含快捷方式和长格式的 expr 文件
% a
\newcommand{\ao}{$^{18}$O}
\newcommand{\aodso}{$^{18}$O/$^{16}$O}
% b
\newcommand{\bea}{\begin{equation}}
\newcommand{\beaa}{\begin{eqnarray}}
% c
\newcommand{\cthree}{C$_3$}
\newcommand{\cfour}{C$_4$}
\newcommand{\coz}{CO$_2$}
infile 包含要替换为长格式的快捷方式
This is my test {\ao}
{\aodso} my test is this
Does it work {\bea}
{\beaa} test test test
work work work {\cthree}
{\cfour} This is my test
my test is this {\coz}
以 expr 和 infile 作为参数调用的脚本的相关小节
while read line; do
if [[ $line == \newcommand* ]]; then
temp=${line#*\{}
sc=${temp%%\}*}
templf=${temp#*\{}
lf=${templf%\}}
#echo $sc, $lf
sed -i -e 's/${sc}/${lf}/g' ${infile}
fi
done < ${expr}
更新:为澄清起见,这是期望的结果,infile 中存在的快捷方式将替换为适当的长格式
This is my test {$^{18}$O}
{$^{18}$O/$^{16}$O} my test is this
Does it work {\begin{equation}}
{\begin{eqnarray}} test test test
work work work {C$_3$}
{C$_4$} This is my test
my test is this {CO$_2$}