これは実際には 2 つの質問であり、分割する必要がありました。しかし、答えは比較的簡単なので、ここに載せておきます。これらの回答は GNU grep
用です
a) egrep
grep -E
と同じです .どちらも、grep
の代わりに「拡張正規表現」を使用する必要があることを示しています のデフォルトの正規表現。 grep
通常の正規表現にはバックスラッシュが必要です。
man
から ページ:
基本正規表現と拡張正規表現
基本的な正規表現では、メタ文字 ? , + 、{ 、 | , ( 、および ) 特別な意味を失います。代わりに、バックスラッシュ付きの \? を使用してください , \+ 、\{ , \| , \( 、および \) .
man
を参照してください 歴史的な慣習と移植性に関する追加の詳細については、ページを参照してください。
b) egrep '(.)\1{N}'
を使用 N
を置き換えます 置換する文字数からマイナス 1 を指定します (ドットは最初のドットと一致するため)。したがって、4 回繰り返される文字に一致させたい場合は、egrep '(.)\1{3}'
を使用します。 .
これは、同じ文字の 2 つ以上の出現を探します:
grep -E '(.)\1+' file
awk に -o オプションがある場合、一致するたびに新しい行に出力されます..
grep -Eo '(.)\1+' file
正確に 3 つの一致がある一致を検索するには:
grep -E '(.)\1{2}' file
または 3 つ以上:
grep -E '(.)\1{2,}' file
など..
編集
実際、@stephane_chazelas は後方参照と -E について正しいです。私はそれを忘れていました。 BSD grep と GNU grep で試してみましたが、そこで動作しますが、他の grep では動作しません。以下のバージョンのいずれかを使用する必要があります..
通常の grep バージョン:
grep '\(.\)\1\{1,\}' file
grep -o '\(.\)\1\{1,\}' file
grep '\(.\)\1\{2\}' file
grep '\(.\)\1\{2,\}' file
-o
オプションも標準のgrep BTWではありません(おそらく、grepが-oを理解していれば、後方参照も実行できます)..
注意 :grep -E '(.)\1{2,}'
ファイルと grep '\(.\)\1\{2\}'
ファイルは alexis が示したように間違っており、無視する必要があります..
まず、あなたのサポートコメントと提案に感謝します。結局のところ、私はすでに答えにかなり近づいていました.
主な問題 約:
<ブロック引用>
n を探す簡単な方法はありますか 同じ文字の出現。 aa
、 tttttt
短い答え :
次の [バリエーション] コマンドは a
を繰り返します 少なくとも1回と無限回
grep 'a\{1,}
grep -E \(a\)\{1,\}
egrep a{1,}
または、GNU 正規表現が利用可能grep a\+
繰り返し回数は、パターン {min,max}
を介して中括弧内に設定されます → {n}
n
を正確に繰り返します 回、{n,}
少なくとも n
繰り返す 回と {n,m}
少なくとも n
繰り返す ただし、多くても m
したがって、結果として、二次的な問題を提起しました :
<ブロック引用>バックラッシュを設定する必要性は、コマンド Iuse にバインドされていますか?
短い答え :はい、バックスラッシュの使用は、grep
を使用するかどうかによって異なります。 または egrep
grep
:バックスラッシュはメタ文字を有効にします [基本的な正規表現を使用]egrep
バックスラッシュ de -メタ文字を有効にする [拡張正規表現を使用]
これは簡単な答えなので、同等の問題に遭遇した人に提供したいのですが、grep
を使用して、注意が必要なように見えるものの基本的な要約を追加しました。 と egrep
.
基本、拡張、および GNU 正規表現
基本的な正規表現
grep
で使用 、 ed
と sed
コマンド
基本的な正規表現セットの機能は次のとおりです:
- ほとんどのメタ文字。
? [ . \ )
などは、バックスラッシュによってアクティブ化されます。バックスラッシュがない場合は、検索語 (の一部) と見なされます。 ^ $ \<
と\>
バックスラッシュなしでサポートされます- 短縮文字は使用できません [
\b
] 、\s
など]
GNU 基本的な正規表現はこれらに追加されます
\?
文字を 0 回または 1 回繰り返す (c\?
c
に一致 とcc
) であり、\{0,1\}
の代替です-
\+
文字を少なくとも 1 回繰り返す (c\+
cc
に一致 、cccccccc
など) であり、\{1,\}
の代替です。 -
\|
がサポートされています (例:grep a\|b
a
を探します またはb
grep -E
コマンドが拡張正規表現のセット全体を使用できるようにします:
拡張正規表現 [ERE]
egrep
で使用 、 awk
と emacs
基本セットにいくつかの機能が追加されています。
- メタ文字はバックスラッシュで無効化されます
- 後方参照なし
- else:通常、正規表現が 1 に対して実行できる多くの魔法
GNU 正規表現の拡張
次の機能を追加します
- 速記クラス
- 数量詞
2 つのリンクは、1 つを regular-expressions.info に誘導します。これは、私がここで得た素晴らしいサポートに加えて、私を大いに助けてくれました。