GNU/Linux >> Linux の 問題 >  >> Linux

Bashで二重文字を見つけるための正規表現

これは実際には 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 を探す簡単な方法はありますか 同じ文字の出現。 aatttttt

短い答え :

次の [バリエーション] コマンドは 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 で使用 、 edsed コマンド

基本的な正規表現セットの機能は次のとおりです:

  • ほとんどのメタ文字。 ? [ . \ ) などは、バックスラッシュによってアクティブ化されます。バックスラッシュがない場合は、検索語 (の一部) と見なされます。
  • ^ $ \<\> バックスラッシュなしでサポートされます
  • 短縮文字は使用できません [\b] 、 \s など]

GNU 基本的な正規表現はこれらに追加されます

  • \? 文字を 0 回または 1 回繰り返す (c\? c に一致 と cc ) であり、 \{0,1\} の代替です
  • \+ 文字を少なくとも 1 回繰り返す (c\+ cc に一致 、 cccccccc など) であり、\{1,\} の代替です。

  • \| がサポートされています (例:grep a\|b a を探します または b

grep -E コマンドが拡張正規表現のセット全体を使用できるようにします:


拡張正規表現 [ERE]

egrep で使用 、 awkemacs 基本セットにいくつかの機能が追加されています。

  • メタ文字はバックスラッシュで無効化されます
  • 後方参照なし
  • else:通常、正規表現が 1 に対して実行できる多くの魔法

GNU 正規表現の拡張

次の機能を追加します

  • 速記クラス
  • 数量詞

2 つのリンクは、1 つを regular-expressions.info に誘導します。これは、私がここで得た素晴らしいサポートに加えて、私を大いに助けてくれました。


Linux
  1. Bash +正規表現で名前を確認しますか?

  2. grepの基本

  3. 6 Bash 条件式の例 ( -e, -eq, -z, !=, [, [[ ..)

  1. 自動化のためのBashの使用

  2. Bash for ループの例

  3. bash スクリプトで unicode を grep する方法

  1. Unicode文字のTrアナログ?

  2. 正規表現の定義?

  3. Bash:置換の正規表現?