grep 2.27を使用してハイフンを一致させようとすると、奇妙な動作が発生します。

grep 2.27を使用してハイフンを一致させようとすると、奇妙な動作が発生します。

次の文字列があります。

-----BEGIN 1_1 CERTIFICATE-----

次のシーケンスはハイフンと一致しません。

grep -- "[A-Z\-\_]" file

\_ハイフンを削除すると、次のようになります。

grep -- "[A-Z\-]" file

バックスラッシュを取り除くとなりますgrep: Invalid range end。また、-E/egrep使用するかどうかにかかわらず同じ結果が得られます。

この行動の理由は何ですか?

答え1

ハイフンを一致させる場合、[...]ハイフンは最初または最後のハイフンでなければなりません。

grep '[A-Z_-]' ...

ハイフンが別の場所にある場合は、範囲を指定すると見なされます。

また、は\リテラルなので[...](完全な式がシェルで引用された場合)[\-]バックスラッシュやハイフン[\-_]および可能であれば\、、、]または(^ASCIIテーブルからからの_範囲の文字である)と一致します。\_

関連情報