4

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

3 に答える 3

5

GNU のコード:

sed -r '/^%/d;s#.*\b(\{\\\w+\})(\{.*\})#\1 \2#;s#\\#\\\\#g;s#(\S+)\s(\S+)#\\|\1|s|\1|\2|g#' file1|sed -f - file2

$ 猫ファイル1
% a
\newcommand{\ao}{$^{18}$O}
\newcommand{\aodso}{$^{18}$O/$^{16}$O}
% b
\newcommand{\bea}{\begin{式}}
\newcommand{\beaa}{\begin{eqnarray}}
% c
\newcommand{\cthree}{C$_3$}
\newcommand{\cfour}{C$_4$}
\newcommand{\coz}{CO$_2$}

$猫ファイル2
これは私のテスト {\ao}
{\aodso} 私のテストはこれです
うまくいきますか {\bea}
{\beaa} テスト テスト テスト
仕事 仕事 仕事 {\cthree}
{\cfour} これは私のテストです
私のテストはこれ {\coz}

$ sed -r "/^%/d;s#.*\b(\{\\\w+\})(\{.*\})#\1 \2#;s#\\#\\\ \#g;s#(\S+)\s(\S+)#\\|\1|s|\1|\2|g#" file1|sed -f - file2
これは私のテストです {$^{18}$O}
{$^{18}$O/$^{16}$O} 私のテストはこれです
うまくいきますか{\begin{equation}}
{\begin{eqnarray}} テスト テスト テスト
仕事 仕事 仕事 {C$_3$}
{C$_4$} これは私のテストです
私のテストはこれです {CO$_2$}

説明:

には 2 つの呼び出しがありますsed。最初の呼び出しは、検索/置換パターンを含むファイルからsedスクリプトを作成します。

sed -r '/^%/d;s#.*\b(\{\\\w+\})(\{.*\})#\1 \2#;s#\\#\\\\ #g;s#(\S+)\s(\S+)#\\|\1|s|\1|\2|g#' ファイル1
\|{\\ao}|s|{\\ao}|{$^{18}$O}|g
\|{\\aodso}|s|{\\aodso}|{$^{18}$O/$^{16}$O}|g
\|{\\bea}|s|{\\bea}|{\\begin{equation}}|g
\|{\\beaa}|s|{\\beaa}|{\\begin{eqnarray}}|g
\|{\\cthree}|s|{\\cthree}|{C$_3$}|g
\|{\\cfour}|s|{\\cfour}|{C$_4$}|g
\|{\\coz}|s|{\\coz}|{CO$_2$}|g

2 番目の呼び出しsedでは、このスクリプトをテキスト ファイルで処理して、置換を行います。

sed -f - file2
于 2013-07-22T19:38:46.353 に答える