gawkで〜演算子の左側に定数正規表現を入れることができないのはなぜですか?

gawkで〜演算子の左側に定数正規表現を入れることができないのはなぜですか?

gawkを使用するとき〜演算子の左側に正規表現を入れることができないのはなぜですか?

たとえば、次のファイルでは、フィールドはタブ(\ t)で区切られています。

$ cat cats
siberian    1970    73  2500
shorthair   1999    60  3000
longhair    1998    102 9859
scottish    2001    30  6000

gawkを使ってレコードを見つけるとうまくいきます。

$ gawk '$1 ~ /h/' cats
shorthair   1999    60  3000
longhair    1998    102 9859
scottish    2001    30  6000

ただし、オペランド $1 と /h/ を移動すると、次の結果は発生しません。

$ gawk '/h/ ~ $1' cats
gawk: cmd. line:1: warning: regular expression on left of `~' or `!~' operator

〜演算子のgawkのマニュアルページは次のように言います:

正規表現の一致、否定的な一致。注:〜または!〜の左側に定数正規表現(/foo/)を使用しないでください。右側にのみ使用されます。 /foo/ ~ exp 表現は (($0 ~ /foo/) ~ exp) と同じ意味を持ちます。これは通常予想されません。

/foo/ 表現が ($0 ~ /foo/) と評価される方法を理解していません。これは、「左に定数正規表現を入れると悪いことが起こります」という弱いフレーズだけを意味するようです。実際には、「左側に定数正規表現を置くと、gawkの動作は定義されていません。そのように使用されるようにプログラムされていないからです」という意味ではありません。

基本的に〜演算子が内部的にどのように評価されるのかわかりません。

ベストアンサー1

awkのPOSIX仕様を引用すると、次のようになります。

~EREトークンがor演算子の右側または後述!~の組み込み関数引数の1つ以外のコンテキストで式として表示される場合、結果式の値は次のようになります。

$0 ~ /ere/

これが(デフォルトで設定されたジョブと組み合わせて{ print })実行を代替として使用できる理由ですawkgrepawk '/b/' <file

したがって、答えは単に「このように動作するように定義されました」です。は特定の状況を除外すると/ere/定義されており、特別な場合ではないためと評価されます。$0 ~ /ere//ere/ ~ $1($0 ~ /ere/) ~ $1

おすすめ記事