Regular-Expression
gawk 中的正則表達式問題(’<’ 不起作用)
我正在嘗試進入 bash 一點點。我正在閱讀本指南,但本小節中關於 gawk的第二個範例似乎不起作用。
問題是這個命令:
ls -l | awk '/\<(a|x).*\.conf$/ { print $9 }'
它只有在我
\<
用空格替換時才有效。我也嘗試過使用\y
,但也沒有運氣。有誰知道這裡可能出現什麼問題?
謝謝 :)
GNU
awk
手冊(第 3.5節)記錄了正則表達式\<
是 gawk 特定的,因此不應期望它在其他實現中工作。根據
man mawk
,如果您在非特殊字元前面放置反斜杠,則反斜杠將被刪除。因此,undermawk
,\<
被簡單地解釋為尖括號字元。例子
我簡化了正則表達式以提供不同行為的範例:
$ echo -e " a\n ab.conf\n <ac.conf" | gawk '/\<(a|x)/ { print}' a ab.conf <ac.conf $ echo -e " a\n ab.conf\n <ac.conf" | mawk '/\<(a|x)/ { print}' <ac.conf
同樣,
gawk
解釋\<
為單詞的開頭,而mawk
僅將其解釋為尖括號。POSIX 對此問題有何看法
GNU
awk
手冊解釋說:如果您在字元串常量中放置一個反斜杠,該反斜杠不是之前列出的字元之一,POSIX awk 會故意將發生的事情保留為未定義。
換句話說,在這種情況下,不同的
awk
口譯員可以自由地做出自己的決定。