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 }
)実行を代替として使用できる理由ですawk
。grep
awk '/b/' <file
したがって、答えは単に「このように動作するように定義されました」です。は特定の状況を除外すると/ere/
定義されており、特別な場合ではないためと評価されます。$0 ~ /ere/
/ere/ ~ $1
($0 ~ /ere/) ~ $1