Grep

GNU grep 手冊中的字元類

  • November 28, 2022

試圖理解為什麼 grep 手冊用一個方括號來說明字元類。

https://www.gnu.org/software/grep/manual/html_node/Character-Classes-and-Bracket-Expressions.html

例如,它聲明:使用

$$ :lower: $$匹配小寫。然而在終端中,我使用它,結果是:

$ grep [:lower:] test
grep: character class syntax is [[:space:]], not [:space:]

我在嘗試使用/理解本手冊時遇到了無數問題,它有什麼問題嗎?它似乎只適用於雙

$$ [ $$], 但沒有任何解釋為什麼手冊說只是使用$$ $$反而。

試圖理解為什麼 grep 手冊用一個方括號來說明字元類。

因為這樣的字元類只有一組括號。您只需要將它們也放在括號表達式中,這意味著最後您有兩組。

該手冊首先給出括號表達式的上下文,這個表達式周圍有括號:

方括號表達式是由[and括起來的字元列表]

以下段落假定該上下文。

方括號表達式中,範圍表達式由用連字元分隔的兩個字元組成。

最後,某些命名的字元類括號表達式中預定義,如下所示。

兩個字元和一個連字元也需要放在括號內,即整個內容是[a-f],而不僅僅是a-f。(*)

字元類也包含在方括號表達式中,例如,字元類[:upper:]包含在方括號中以給出方括號表達式[[:upper:]]。或者,如果您在方括號中放置了不止一個字元類,您可以使用[-[:upper:][:digit:]]匹配破折號、大寫字母或數字的字元類。(單個括號表達式中的一個普通字元和兩個字元類。)

至於為什麼語法是這樣的,我不知道。

請注意,該手冊甚至包含有關如何使用字元類的完整範例:

…例如,[[:alnum:]]表示目前語言環境中數字和字母的字元類。

它說:

請注意,這些類名稱中的括號是符號名稱的一部分,並且必須包含在分隔括號表達式的括號之外。

還描述了您收到的錯誤消息:

如果您錯誤地省略了外括號,並蒐索 say, [:upper:],GNU grep 會列印診斷資訊並以狀態 2 退出,假設您不打算搜尋正則表達式[:epru]

所以,它看起來真的不像是在告訴整個交易只使用一組括號。

除了……的例子[:alnum:](並且[:alpha:]是相似的):

[:alnum:] 字母數字字元:[:alpha:][:digit:];在“C”語言環境和 ASCII 字元編碼中,這與[0-9A-Za-z].

這是錯誤的。[0-9A-Za-z]與 相同[[:alnum:]],不是[:alnum:][:alnum:]會是0-9A-Za-z,但兩者都需要外括號來做任何有用的事情。

當然,錯誤消息似乎也沒有提到字元類和括號表達式之間的區別,所以是的,它們在那裡有點不清楚。


請注意,由於括號在 shell 中也是 glob 字元,因此您應該引用模式,例如

grep '[[:lower:]]' test

否則,模式將由 shell 擴展為:, e, l, o, r, 或w,如果存在任何具有這些確切名稱的文件。

(* 請注意,注意事項適用於字元範圍,它們的解釋取決於語言環境,以及 Bash 中的globasciiranges選項,我認為它已被證明表現得很奇怪。)

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