GNU grep 手冊中的字元類
試圖理解為什麼 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
選項,我認為它已被證明表現得很奇怪。)