1

私は最近-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なく、文字列定数のエスケープ規則が適用されることを示すテキストがありません。

私の質問:

  1. man ページよりも信頼できる awk 言語の情報源はありますか? もしそうなら、それは何を指定していますか?
  2. POSIXはこれについて何を言わなければなりませんか?
  3. Awk のすべてのバージョンはこのように動作しますか? つまり、実際に必要な場合に実行される拡張に依存できますか?
4

1 に答える 1

3

代入は文字列定数です。

標準の関連セクションは次のとおりです。

-v 割り当て アプリケーションは、割り当て引数が割り当てオペランドと同じ形式であることを保証します。指定された変数の割り当ては、BEGIN パターン (存在する場合) に関連付けられたアクションを含め、awk プログラムを実行する前に行われます。このオプションは複数回指定できます。

移植可能な文字セット ( XBD Portable Character Set の表を参照) のアンダースコアまたは英字で始まり、その後に移植可能な文字セットのアンダースコア、数字、およびアルファベットのシーケンスが続き、その後に「=」文字が続くオペランド、パス名ではなく変数の割り当てを指定する必要があります。「=」の前の文字は awk 変数の名前を表します。その名前が awk 予約語 ( Grammar を参照) である場合、動作は未定義です。<equals-sign> に続く文字は、前と後に二重引用符 ( ' )' 文字が続く awk プログラムに出現したかのように解釈され、STRING トークン (文法を参照) として解釈されます。エスケープされていない 、シーケンス「\」の最初の文字としてではなく、リテラルとして解釈されます

于 2012-12-10T20:52:23.510 に答える