私は 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$}