私の質問は、誰かがhttp://tex.stackexchange.comで尋ねた興味深い質問と、AWK ソリューションを提供しようとする私の試みに触発されたものです。ここでの AWK は NAWK を意味することに注意してください。ここでその答えを少し再現しています。gawk != awk
元の質問:
多くの数学表記を含むかなり大きなドキュメントがあります。|foo|
全体を通して、foo の絶対値を示すために使用してきました。|foo|
のすべてのインスタンスをに置き換えて\abs{foo}
、定義した abs マクロを介して表記を制御できるようにします。
私の答え:
この投稿は、cmhughesが提案したソリューションに触発されています。彼の投稿は、私が今まで読んだ TeX 編集に関する最も興味深い投稿の 1 つです。nawk ソリューションの作成に 2 時間費やしました。その過程で、AWK は sed のいとこであるため期待される貪欲でない正規表現をサポートしていないだけでなく、さらに悪いことに AWK 正規表現はそのグループをキャプチャしないことを知りました。シンプルな AWK スクリプト
#!/usr/bin/awk -f
NR>0{
gsub(/\|([^|]*)\|/,"\\abs{\1}")
print
}
ファイルに適用
$|abs|$ so on and so fourth
$$|a|+|b|\geq|a+b|$$
who is affraid of wolf $|abs|$
残念ながら生産します
$\abs{}$ so on and so fourth
$$\abs{}+\abs{}\geq\abs{}$$
who is affraid of wolf $\abs{}$
上記の解決策の明らかな修正は、 代わりにgawkを使用することです
awk '{print gensub(/\|([^|]*)\|/, "\\abs{\\1}", "g", $0)}'
ただし、AWK からtreなどの外部正規表現ライブラリを使用する方法があるかどうかは疑問です。さらに一般的には、AWK と C コードのインターフェイスはどのようになっているのでしょうか (ドキュメントへのポインターは問題ありません)。