マニュアルページを読むgrep
(ハイライト)
定期的な 表現方式 正規表現は、文字列のセットを記述するパターンです。正規表現は次のとおりです。 算術式に似ており、さまざまな演算子を使用して結合 より小さい表現。 grep正規表現構文の3つの異なるバージョン、「基本」(BRE)、 「拡張」(ERE)および「perl」(PCRE)。 GNUでは grep 利用可能な内容に違いはありません。 基本文法と拡張文法の機能。
もっと下に書いています。
繰り返す 正規表現の後には、複数の反復演算子の1つが続きます。 ? 前の項目はオプションであり、最大1回一致することができます。 * 前のエントリは0回以上一致します。 + 前の項目が複数回一致します。 {N} 前の項目は正確にn回一致します。 {N、} 前のエントリがn回以上一致します。 {,米} 前のエントリは最大m回一致します。これはGNU拡張です。 {N、米} 前の項目がn回以上一致しますが、m回以下で一致します。
最後の行は次のようなので、GNUのgrepを使用していると思います。
User Commands GNU grep 2.16 GREP(1)
それでは、$ echo aa | grep a{2}
インクルードは期待どおりに機能しますが、なぜ何も出力できませんか?-E
答え1
ここで微妙な点は違いはありませんが、特徴、そこにはい違い通事論。特に:
- BREでは、
{
andは}
エスケープされない限りリテラルです。この場合、量子式を表します。
しかし、
- EREからエスケープされない限り、数量子を束ね
{
ます}
。この場合、数量子はリテラルです。
だから
$ echo aa | grep 'a\{2\}' # BRE
aa
$ echo aa | grep -E 'a{2}' # ERE
aa
式を引用符で囲まない場合は、シェルがバックスラッシュを拡張しないようにバックスラッシュをエスケープする必要があります。
$ echo aa | grep a\\{2\\} # BRE
aa
答え2
マニュアルページの下のセクションを参照してください。
基本正規表現と拡張正規表現
In basic regular expressions the meta-characters ?, +, {, |, (, and )
lose their special meaning; instead use the backslashed versions \?,
\+, \{, \|, \(, and \).