Regular-Expression

gawk 中的正則表達式問題(’<’ 不起作用)

  • January 5, 2017

我正在嘗試進入 bash 一點點。我正在閱讀本指南,但本小節中關於 gawk的第二個範例似乎不起作用。

問題是這個命令:

ls -l | awk '/\&lt;(a|x).*\.conf$/ { print $9 }'

它只有在我\&lt;用空格替換時才有效。我也嘗試過使用\y,但也沒有運氣。

有誰知道這裡可能出現什麼問題?

謝謝 :)

GNUawk手冊(第 3.5節)記錄了正則表達式\&lt;是 gawk 特定的,因此不應期望它在其他實現中工作。

根據man mawk,如果您在非特殊字元前面放置反斜杠,則反斜杠將被刪除。因此,under mawk,\&lt;被簡單地解釋為尖括號字元。

例子

我簡化了正則表達式以提供不同行為的範例:

$ echo -e " a\n ab.conf\n &lt;ac.conf" | gawk '/\&lt;(a|x)/ { print}'
a
ab.conf
&lt;ac.conf
$ echo -e " a\n ab.conf\n &lt;ac.conf" | mawk '/\&lt;(a|x)/ { print}'
&lt;ac.conf

同樣,gawk解釋\&lt;為單詞的開頭,而mawk僅將其解釋為尖括號。

POSIX 對此問題有何看法

GNUawk手冊解釋說:

如果您在字元串常量中放置一個反斜杠,該反斜杠不是之前列出的字元之一,POSIX awk 會故意將發生的事情保留為未定義。

換句話說,在這種情況下,不同的awk口譯員可以自由地做出自己的決定。

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