Использование sed в bash script для замены псевдонимов LaTeX
Я относительно новичок в bash-скриптинге и не имею опыта работы с LaTeX. Меня попросили разработать скрипт, который заменит удобные ярлыки в документах LaTeX на их более громоздкие эквиваленты в длинных формах.
о сих пор мой подход заключался в том, чтобы изолировать ярлык и длинную форму в отдельных переменных, а затем попытаться заменить их в тексте с помощью sed. Я приложил короткие примеры файлов ниже.
Поскольку в настоящее время сценарий принимает 2 аргумента, файл expr, из которого он извлекает ярлыки и терминологию длинных форм, и файл, в который предполагается внести соответствующие изменения. Я знаю, что скрипт правильно изолирует ярлыки и длинные формы и может их вернуть, но он не может выполнить команду sed.
Я пытался найти это в Интернете и нашел несколько похожих вопросов, где предполагалось, что у sed трудно распознать переменную и что различные типы комбинаций котировок могут решить проблему. Я перепробовал много перестановок, и ни одна из них не сработала. Во многих случаях термины длинной формы содержат специальные символы, такие как '!$3$!#39; и '{}', поэтому я подозреваю, что это может быть проблемой, но я не уверен. Я также очень открыт для других идей о том, как решить проблему. Ниже приведены примеры как скрипта, так и двух файлов аргументов, 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$}