Używanie sed w skrypcie bash do zastępowania aliasów LaTeX
Jestem stosunkowo nowym użytkownikiem skryptów bash i nie mam doświadczenia z LaTeX. Poproszono mnie o opracowanie skryptu, który zastąpi skróty wygody w dokumentach LaTeX ich bardziej uciążliwymi odpowiednikami o długiej formie.
Moje podejście do tej pory polegało na wyodrębnieniu zarówno skrótu, jak i długiej formy w osobnych zmiennych, a następnie próby zastąpienia ich w tekście za pomocą sed. Poniżej załączam krótkie przykładowe pliki.
Ponieważ obecnie skrypt przyjmuje 2 argumenty, plik expr, z którego pobiera skróty i terminologię o długiej formie, a plik infile, do którego należy wprowadzić odpowiednie zmiany. Wiem, że skrypt właściwie izoluje zarówno skróty, jak i długie formy i może je zwrócić, ale wydaje się, że nie może wykonać polecenia sed.
Próbowałem przeszukać to online i znalazłem wiele podobnych pytań, w których sugerowano, że sed z trudem rozpoznaje zmienną i że różne kombinacje cytatów mogą rozwiązać problem. Próbowałem wielu permutacji i żadna z nich nie działa. Długie formy terminologii w wielu przypadkach zawierają znaki specjalne, takie jak „!$3$!#8221; i „{}”, więc podejrzewam, że to może być problem, ale nie jestem pewien. Jestem również bardzo otwarty na inne pomysły dotyczące rozwiązania problemu. Poniżej znajdują się przykłady zarówno skryptu, jak i 2 plików argumentów, expr i infile.
lik @expr zawierający skróty i długie formularze
% 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 zawierający skróty, które należy zastąpić długimi formularzami
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}
Odpowiedni podsekcja skryptu wywołana z wyrażem i infilem jako argumenty
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}
UPDATE: Dla wyjaśnienia, to byłby pożądany wynik, skróty obecne w infile zostaną zastąpione odpowiednią długą formą
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$}