9

grepに少し問題があり、理解できないようです。ソースファイルのセットで二重引用符(C文字列)で囲まれた小文字の単語のすべてのインスタンスを検索しようとしています。bashとgnugrepの使用:

grep -e '"[a-z]+"' *.cpp

マッチはありませんが

grep -e '"[a-z]*"' *.cpp

小文字だけではない「Abc」のような一致が表示されます。「abc」のみに一致する適切な正規表現は何ですか?

4

4 に答える 4

8

メタ文字をエスケープするのを忘れています。

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ロケールを使用できます。

于 2012-05-10T18:50:04.070 に答える
1

+をマスクします

grep -e '"[a-z]\+"' *.cpp

またはegrepを使用します。

egrep  '"[a-z]+"' *.cpp

多分あなたは-Eを念頭に置いていました:

grep -E '"[a-z]+"' *.cpp

小文字の-eは、たとえば、複数の検索パターンを指定するために使用されます。

大文字の現象は、ロケールに由来する可能性があります。これは、次の方法で防ぐことができます。

LC_ALL=C egrep  '"[a-z]+"' *.cpp
于 2012-05-10T18:47:39.543 に答える
0

あなたはおそらく脱出する必要があります+

grep -e '"[a-z]\+"' *.cpp
于 2012-05-10T18:49:15.427 に答える
0

ロケールをいじりたくない場合は、これでうまくいきました:

grep -e '"[[:lower:]]\+"'
于 2015-07-22T10:08:05.780 に答える