web-dev-qa-db-ja.com

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

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

主な質問aalltttttなどのシーケンスを探す簡単な方法はありますか。同じキャラクターの?私が探しているのは、非常に基本的なレベルでこれを達成することです。コマンドライン。 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は正しいですか?

10
erch

これは本当に2つの質問であり、分割する必要がありました。しかし、答えは比較的単純なので、ここに示します。これらの回答は特にGNU grepを対象としています。

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

manページから:

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

基本的な正規表現では、メタ文字+{、、、およびは特別な意味を失います。代わりにバックスラッシュバージョン\?\ +\ {\\ (、および\)

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

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

8
depquid

これは、同じ文字の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,}' fileおよびgrep '\(.\)\1\{2\}' fileはアレクシスが示されているため間違っているため、無視してください。

7
Scrutinizer

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

主な問題は約でした:

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回繰り返します。

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

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

短い回答:はい、バックスラッシュの使用は、grepegrepのどちらを使用するかによって異なります

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

これは短い答えなので、同等の問題に遭遇した人に提供したいので、grepegrepを使用して、一見注意する必要があることの基本的な概要を追加しました。




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

基本的な正規表現

grepedsedコマンドで使用

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

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

[〜#〜] gnu [〜#〜]基本正規表現はこれらに追加します

  • _\?_文字を0回または1回繰り返し(_c\?_はcand ccと一致)、_\{0,1\}_の代替です
  • _\+_文字を少なくとも1回繰り返し(_c\+_はccccccccccなどと一致します)、_\{1,\}_の代替です

  • _\|_がサポートされています(例:_grep a\|b_はaまたはbを検索します

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


拡張正規表現[ERE]

egrepawk、およびemacsで使用されるのは、基本セットといくつかの機能です。

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

[〜#〜] gnu [〜#〜]拡張正規表現

次の機能を追加します

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

3
erch