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:]
このマニュアルの使用/理解には絶え間ない問題があります。もし間違ったことがありますか?二重[[]]としてのみ機能するようですが、マニュアルには[]を使用するように説明する理由はありません。
答え1
grepマニュアルが角かっこを使用して文字クラスを宣言する理由を理解しようとしています。
なぜならキャラクタークラスしたがって、括弧セットは1つだけです。角かっこ式にも入れるだけで2つのセットが生成されるという意味です。
マニュアルは、最初に括弧で囲まれた括弧表現の文脈を提供します。
[
角括弧式は、で囲まれた文字のリストです]
。
次の段落では、この文脈を想定しています。
以内に角かっこ式、範囲式は、ハイフンで区切られた2文字で構成されています。
最後に、特定の名前付き文字クラスが事前定義されています。以内に角かっこ式は次のとおりです。
これら2文字とハイフンも角かっこ内になければなりません。つまり、 。[a-f]
だけでなく、全体の内容ですa-f
。(*)
文字クラスも角かっこ式内にあるため、たとえば、文字クラスを[:upper:]
角かっこで囲むと、角かっこ式が提供されます[[:upper:]]
。または、複数の文字クラスを括弧内に配置する場合は、[-[:upper:][:digit:]]
ダッシュ、大文字、または数字に一致する文字クラスを使用できます。 (角かっこ式には、一般文字1個と文字クラス2個が含まれます。)
構文がなぜこのようなのかはわかりません。
マニュアルには、文字クラスの使用方法の完全な例も含まれています。
...たとえば、
[[:alnum:]]
現在のロケールの数字と文字を表す文字クラスです。
それは言う:
これらのクラス名の角かっこは記号名の一部であり、角かっこ式を区切る角かっこを含める必要があります。
表示されるエラーメッセージも説明されています。
たとえば、誤って外部括弧を省略して検索すると、
[:upper:]
GNU grepは診断メッセージを印刷し、正規表現を検索する意図がないと仮定して状態2で終了します[:epru]
。
したがって、トランザクション全体に1つの角かっこセットを使用するように指示するようには見えません。
他にも...例は次のとおりです[:alnum:]
([:alpha:]
類似)。
[:alnum:]
英数字:[:alpha:]
と[:digit:]
; 「C」ロケールおよびASCII文字エンコーディングと同じです[0-9A-Za-z]
。
これは間違っています。[0-9A-Za-z]
と同じです。[[:alnum:]]
いいえ[:alnum:]
。[:alnum:]
はい0-9A-Za-z
、しかし、どちらも役に立つ作業を行うには、外部の括弧が必要です。
もちろん、エラーメッセージには文字クラスと角括弧式の違いは言及されていないようです。したがって、少し不明瞭です。
括弧もシェルのグローバル文字であるため、パターンを引用する必要があります。
grep '[[:lower:]]' test
それ以外の場合、シェルはパターンを、、、、:
またはこれらの正確な名前のファイルがある場合は拡張します。e
l
o
r
w
(*警告は文字範囲に適用され、その解釈はロケールとBashのオプションによって異なります。globasciiranges
奇妙に動作します。)