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


10

コマンドライン(Bash)で、テキスト、リストなどの二重文字のすべての出現を検出する正規表現を探しています。

主な質問:様配列を探すための簡単な方法があるaallttttt1は同じ文字のn個の出現箇所を検索することを正規表現を定義し、その他は?私が探しているのは、非常に基本的なレベルでこれを達成することです。コマンドライン。Linuxシェル。

かなりの調査の後、私は次の答えにたどり着きました–そしてそれらから生じる質問、そしてそれゆえ彼らは私に解決策がどこにあるのかについてのヒントを与えてくれました。だが:

a)(e)grepとバックスラッシュの問題

  • grep 'a\{2\}' 探す aa
  • egrep'a{2}' 探す aa

質問:バックラッシュを設定する必要性は、実際に使用するコマンドにバインドされていますか?もしそうなら、誰かがここで(e)grepを使用するときに考慮すべき他のことを教えてくれますか?

b)私が探していたものとは異なりますが、この質問に対する回答をここで見つけました。

grep -E '(.)\1' filename同じ文字が複数回出現するエントリを探しますが、その頻度は尋ねません。これは私が探しているものに近いですが、繰り返しの数を設定したいと思います。

私はおそらくこれを2つ以上の質問に分割する必要がありますが、この素晴らしいサイトをここに殺到させたくありません。

PS:もう一つの問題、おそらくトピックオフけど:それであるininsideatまたはon the shell。そしてon the command line正しいですか?

回答:


8

これは本当に2つの質問であり、分けられるべきでした。しかし、答えは比較的単純なので、ここに示します。これらの回答はgrep特にGNU 向けです。

a)egrepはと同じgrep -Eです。どちらも、grepのデフォルトの正規表現の代わりに「拡張正規表現」を使用する必要があることを示しています。 grep単純な正規表現には円記号が必要です。

manページから:

基本正規表現と拡張正規表現

基本的な正規表現では、メタ文字は+{| 、およびは特別な意味を失います。代わりに円記号バージョンを使用しますか?\ +\ {\ | \(、および\)

man歴史的慣習と移植性の詳細については、ページを参照してください。

b)マイナス1と置き換えたい文字数を使用egrep '(.)\1{N}'して置き換えNます(ドットが最初の文字と一致するため)。したがって、4回繰り返される文字と一致させる場合は、を使用しますegrep '(.)\1{3}'


マニュアルページを読んだとき、私はあなたが指摘した部分を本当に誤解しているか、誤解しているに違いありません。正規表現のチュートリアルをいくつか進めたとき、そのような動作が予想されるようなヒントはありませんでした。正規表現とは、ほとんどのアプリケーションが同じ記号のセットを処理するような基本的なレベルの何かを意味すると思いました。繰り返しますが、私は間違っていることが証明されました。ご協力いただきありがとうございます!これは本当に私を助けました。
erchは2013

また常にバックスラッシュを使用して。、+などの文字から特別な意味をとる」と読むとかなり混乱します。次に、最も基本的なコマンドでは、その逆のルールが規則であることがわかります。
2013

@ cellar.dwellerわかりにくいです!推論の多くは歴史的なものです。私は拡張形式に慣れているので、egrep正規表現が必要な場合は(単純な文字列照合ではなく)常に使用する習慣を付け、grep2つのの違いを覚えておく必要がないようにします正規表現のタイプ。
2013

4
標準のEREは後方参照をサポートしていませんが、標準のBREはサポートしています。だからgrep '\(.\)\1\{3\}'標準です、そうではgrep -E '(.)\1{3}'ありません。
ステファンChazelas

7

これは、同じ文字の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で試してみましたが、そこでは機能しますが、他の一部のgrepsでは機能しません。以下のバージョンのいずれかを使用する必要があります。

通常の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\}'ファイルは、アレクシスが示されているため間違っています。無視してください。


今までありがとう。しかし、私-Eオプションなしでgrepはあまり効果がないと言っているのでしょうか?これは、たとえば、なぜ私が間違っていた場所を探すのに多くの時間を無駄にしたのかなど、かなり説明します。
13

この場合、-Eオプションがなくても同じことができますが、さらにエスケープする必要があり、+演算子はありません。例も掲載します。
Scrutinizer 2013

小さな修正:grep -E '(.)\1{2}'正確に「正確に3一致する一致を見つける」ではありません。正確に3つの同じ文字と一致しますが、長い文字列に埋め込まれている場合があります。たとえば、5つの記号の文字列で一致しますAAAAA。(6つ以上の連続したシンボルがある場合、それは複数回一致します)。
アレクシス2016年

はい、あなたはそれが...のようなことはできません実際には、意図したとおりの仕事をしないこと、絶対的に正しいです
Scrutinizer

3

まず、あなたの支持コメントと提案をありがとうございました。結局のところ、私はすでに答えにかなり近づいていました。

主な問題は、程度でした。

探すための簡単な方法があるのn例えば同じ文字の出現箇所は、aatttttt

短い答え

次の[バリエーション]コマンドはa、少なくとも1回無限に繰り返されます

grep 'a\{1,}

grep -E \(a\)\{1,\}

egrep a{1,}

または、GNU正規表現を使用可能 grep a\+


repeatingsの数はパターンを介して、中括弧内に設定されている{min,max}{n}繰り返し正確にn、時間を{n,}少なくとも繰り返しn回数と{n,m}少なくとも繰り返しnますが、ほとんどのm回。

したがって、結果として、二次的な問題が発生しました

使用するコマンドにバックラッシュを設定する必要はありますか?

短い答え:はい、バックスラッシュを使用するかどうかを1つの用途に依存しgrepたりegrep

  • grep:バックスラッシュはメタ文字をアクティブにします[基本的な正規表現を使用します]
  • egrepバックスラッシュ -activatesメタ文字[用途は正規表現を拡張]

これは短い答えなので、同等の問題に遭遇した人たちに提供したいので、私が知っている必要があると思われる、grepおよびとの作業についての私の基本的な要約を追加しましたegrep




基本、拡張、およびGNU正規表現

基本的な正規表現

grepedおよびsedコマンドで使用

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

  • たとえば、ほとんどのメタキャラクターは? [ . \ )、バックスラッシュでアクティブ化されます。バックスラッシュがない場合、それらは検索語(の一部)として使用されます。
  • ^ $ \<および\>バックスラッシュなしでサポートされています
  • いいえ速記文字はありません[ \b\sなど]

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

  • \?文字を0回または1回繰り返し(c\?一致ccc)、\{0,1\}
  • \+文字に少なくとも1回(繰り返しc\+マッチccccccccccなど)とのための代替手段です\{1,\}

  • \|サポートされている(例えばgrep a\|b探しますab

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


拡張正規表現[ERE]

で使用されるegrepawkおよびemacs基本セットに加えて、非常にいくつかの機能です。

  • メタ文字はバックスラッシュで無効化されます
  • 後方参照なし
  • 他:通常、多くの魔法の正規表現で1つのことができます

GNU Extendend正規表現

次の機能を追加します

2つのリンクは1つをregular-expressions.infoに導きます。これは、私がここで得たすごいサポートに加えて、本当に非常に役立ちました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.