grepに少し問題があり、理解できないようです。ソースファイルのセットで二重引用符(C文字列)で囲まれた小文字の単語のすべてのインスタンスを検索しようとしています。bashとgnugrepの使用:
grep -e '"[a-z]+"' *.cpp
マッチはありませんが
grep -e '"[a-z]*"' *.cpp
小文字だけではない「Abc」のような一致が表示されます。「abc」のみに一致する適切な正規表現は何ですか?
メタ文字をエスケープするのを忘れています。
grep -e '"[a-z]\+"'
2番目の部分では、大文字と小文字が一致する理由は、ロケールが原因です。次のように:
$ echo '"Abc"' | grep -e '"[a-z]\+"'
"Abc"
$ export LC_ALL=C
$ echo '"Abc"' | grep -e '"[a-z]\+"'
$
「ASCIIのような」動作を得るには、grepのマニュアルページで指定されているように、ロケールを「C」に設定する必要があります。
角かっこ式内では、範囲式はハイフンで区切られた2文字で構成されます。これは、ロケールの照合シーケンスと文字セットを使用して、2つの文字の間でソートされる任意の1文字に一致します。たとえば、デフォルトのCロケールでは、[ad]は[abcd]と同等です。多くのロケールは文字を辞書順にソートします。これらのロケールでは、[ad]は通常[abcd]と同等ではありません。たとえば、[aBbCcDd]と同等である可能性があります。角かっこ式の従来の解釈を取得するには、LC_ALL環境変数を値Cに設定することにより、Cロケールを使用できます。
+をマスクします
grep -e '"[a-z]\+"' *.cpp
またはegrepを使用します。
egrep '"[a-z]+"' *.cpp
多分あなたは-Eを念頭に置いていました:
grep -E '"[a-z]+"' *.cpp
小文字の-eは、たとえば、複数の検索パターンを指定するために使用されます。
大文字の現象は、ロケールに由来する可能性があります。これは、次の方法で防ぐことができます。
LC_ALL=C egrep '"[a-z]+"' *.cpp
あなたはおそらく脱出する必要があります+
:
grep -e '"[a-z]\+"' *.cpp
ロケールをいじりたくない場合は、これでうまくいきました:
grep -e '"[[:lower:]]\+"'