0

すべての出力ファイルを gawk でチェックするようになりましたが、これはできる限り避けています。どうやって

gawk 'NF \!= 6' file

異なる

gawk 'NF != 6' file 

つまり、バックスラッシュはこの式の意味をどのように変えるのでしょうか?

フィールド数が 6 以外でバックスラッシュで終わる行を出力する必要がありますか?

ファイルに次のエラーが表示されます。

gawk:    ^ backslash not last character on line

誰か?

4

4 に答える 4

2

一重引用符の代わりに二重引用符を使用する場合、!は特殊文字であり、バックスラッシュでエスケープする必要があります。重要なのは、シェルが感嘆符を認識しないように感嘆符をエスケープしていることです。

gawk "NF \!= 6" file

二重引用符内では、シェルは引数を gawk に渡す前に変換\!します。!バックスラッシュは、gawk が呼び出されるまでになくなります。

ただし、単一引用符では、シェルは!文字を無視するため、バックスラッシュでエスケープする必要はありません。実際、バックスラッシュが gawk に渡されてしまい、予期しない\.

于 2010-11-11T21:08:12.623 に答える
1

バックスラッシュのない行は期待どおりに機能します。ただし、知りたい場合は、バックスラッシュは通常、特殊文字をエスケープするために使用され(特殊文字は失われ、それ自体として使用されます)、長い行を分割するためにも使用されるため、(シェルの下で)次のように記述できます。

$ gawk 'NF \
!= 6' file

そしてそれは同じ効果をもたらすでしょう。

特にあなたの例はもう少しトリッキーです。文字列は一重引用符で囲みます。これにより、シェルは作成した内容を変更せず、プログラムに渡します。バックスラッシュ式を使用すると、gawkは\意味のない場所に''を見つけます(gawkでは、長い行を分割し、文字列内の文字をエスケープするためにのみ使用されます)。私が2行のバックスラッシュで書いた例では、gawkはバックスラッシュで分割された2行(概念的には1行)を受け取ります。

于 2010-11-11T21:05:39.943 に答える
1

6 つのフィールドを持たず、バックスラッシュで終わる行を一致させようとしている場合、これはそれを行う 1 つの方法です。

gawk -v 'patt=\\\\$' 'NF != 6 && $0 ~ patt' file

gawk (および他の AWK) には、バックスラッシュのエスケープに関していくつかの複雑な規則があります。そのため、前のコマンドで 4 つのバックスラッシュが使用されています。(ドル記号は、他の正規表現と同様に、データ ファイルからの入力行の終わりを表します。)

于 2010-11-11T21:41:13.550 に答える
1

二重引用符を使用するか単一引用符を使用するかに関係なく、Bourne のようなシェルを使用している場合、gawk は引用符の間に表示されるプログラムを正確に認識します。二重引用符であっても、Bourne と csh のようなシェルは両方とも、エスケープが必要な可能性のある文字 ($ など、csh の場合は ! など) の前に \ を消費するだけです。したいことをしないでください)。

! このコンテキストでは gawk する意味がないため、エラーが発生します。「フィールド数が 6 以外でバックスラッシュで終わる行を出力する」には、次のようにします。

gawk 'NF != 6 && /\\$/' file

つまり、6 つのフィールドを持たず、行末 ($) の直前の \ に一致する行に一致します。gawk もエスケープに \ を使用するため、\ は別のバックスラッシュでエスケープする必要があります。特殊文字をエスケープしないものは単純に省略されます。

アクションが関連付けられていない場合、この条件ステートメントが満たされると、デフォルトのアクション (行を印刷) が実行されます。

于 2010-11-27T07:29:31.043 に答える