私は最近-v VAR=VAL
、コマンド ラインで変数を初期化するための Awk の構文が、VAL でエスケープ シーケンスを展開することを発見しました。以前は、文字列に対して最初にエスケープ関数を実行する必要なく、文字列を Awk に渡す良い方法だと考えていました。
たとえば、次のスクリプトです。
awk -v VAR='x\tx' 'BEGIN{printf("%s\n", VAR);}'
私は印刷することを期待します
x\tx
しかし、実際には次のように出力されます:
x x
余談ですが、代わりに文字列を変更せずに渡すための環境変数です。この質問は、私が以前に期待した動作を取得する方法を尋ねているわけではありません。
この問題に関するマニュアルページの説明は次のとおりです。
-v var=val , --assign var=valプログラムの実行が始まる前に、値 val を変数 var に代入します。このような変数値は、AWK プログラムの BEGIN ブロックで使用できます。
そしてさらに下:
文字 列定数 AWK の文字列定数は、二重引用符で囲まれた一連の文字です ("value" など)。文字列内では、C のように、特定のエスケープ シーケンスが認識されます。これらは次のとおりです。
... エスケープシーケンスのリスト ...
エスケープ シーケンスは、定数の正規表現内でも使用できます (たとえば、/[ \t\f\n\r\v]/ は空白文字に一致します)。
互換モードでは、8 進および 16 進のエスケープ シーケンスで表される文字は、正規表現定数で使用される場合、文字どおりに扱われます。したがって、/a\52b/ は /a*b/ と同等です。
私がこれを読んだ方法は、文字列定数val
で-v var=val
はなく、文字列定数のエスケープ規則が適用されることを示すテキストがありません。
私の質問:
- man ページよりも信頼できる awk 言語の情報源はありますか? もしそうなら、それは何を指定していますか?
- POSIXはこれについて何を言わなければなりませんか?
- Awk のすべてのバージョンはこのように動作しますか? つまり、実際に必要な場合に実行される拡張に依存できますか?