Gawk

為什麼不能在 gawk 中的 ~ 運算符左側放置一個常量正則表達式?

  • March 24, 2018

為什麼我在使用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 的行為是未定義的,因為它沒有被程式為以這種方式使用”。

我基本上不明白運營商 ~ 是如何在內部評估的。

引用 awk 的 POSIX 規範:

~當 ERE 標記在任何上下文中作為表達式出現時,而不是作為or運算符的右手!~或作為下面描述的內置函式參數之一,結果表達式的值應等效於:

$0 ~ /ere/

這(與預設為 的操作相結合{ print })就是為什麼您可以通過awk做.grep``awk '/b/' <file

因此,答案只是“它被定義為以這種方式工作”。 /ere/被定義為$0 ~ /ere/在某些情況下除外,並且/ere/ ~ $1不是例外情況之一,因此它被評估為($0 ~ /ere/) ~ $1

引用自:https://unix.stackexchange.com/questions/209888