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

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

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

主な問題:同じ文字がn回出てくるものを見つけるために正規表現を定義するなどaallシーケンスを簡単に見つける方法はありますか?ttttt私が探しているのは、非常に基本的なレベルでこれを達成することです。コマンドラインから。 Linuxシェルから。

かなりの研究の終わりに、私は次の答えとそれから発生する質問を思い出しました。だから彼らは解決策がどこにあるかについてのヒントを提供するだけです。しかし:

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

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

質問:間隔を設定する必要性は、実際に私が使用するコマンドに関連していますか?それでは、ここで(e)grepを使用するときに考慮すべきことが何であるかを教えることができる人はいますか?

b)私は見つけたこの回答はここにあります私の問題の場合、これはまさに私が望むものではありませんが、

grep -E '(.)\1' filename同じ文字が複数回表示される項目を探します。どんなに頻繁に。これは私が探しているものと似ていますが、まだいくつかの繰り返しを設定したいと思います。

おそらくこれを2つ以上の質問に分ける必要があるようですが、ここではこの素晴らしいサイトを圧倒したくありません。

PS:もう一つの質問です。トピックと異なる場合がありますが、はいininsideまだそうです。そしてそれは正しいですか?aton the shellon the command line

答え1

これは実際には2つの質問なので、別々に答える必要があります。しかし、答えは比較的簡単なので、ここに置きます。この回答はGNUに固有のものですgrep

A)egrepと同じですgrep -E。どちらもデフォルトのgrep正規表現の代わりに「拡張正規表現」を使用する必要があることを示します。grep一般正規表現にはバックスラッシュが必要です。

manページから:

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

基本正規表現では、メタ文字+{|)特別な意味を失います。代わりにバックスラッシュバージョンを使用してください。\?\+\{\|\(\)

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

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

答え2

これにより、同じ文字が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が指摘したように無視する必要があります。

答え3

まず第一に、あなたの支持的な意見や提案に感謝します。私はその答えにかなり近かったことがわかりました。

これ主な問題それについて:

簡単に見つける方法がありますか?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}nm

したがって、提案されたマイナーな問題:

私が使用する命令に関連する間隔を設定する必要がありますか?

短い答え:はい、バックスラッシュを使用するgrepかどうかegrep

  • grep:バックスラッシュはメタ文字を有効にします。 [基本正規表現の使用]
  • egrepバックスラッシュダック-メタ文字を有効にする[拡張正規表現を使用]

grepこれは短い答えであり、同様の問題に直面した人々に助けを望んでいたので、人々が使用するときに注意する必要があると思われる事項の基本的な要約を追加しましたegrep




基本、拡張、GNU正規表現

基本正規表現

とコマンドに使用されますgrepedsed

デフォルトの正規表現セット関数は次のとおりです。

  • ほとんどのメタ文字(例:? [ . \ )など)はバックスラッシュを通じて有効になります。バックスラッシュがない場合は、検索語(の一部)として扱われます。
  • ^ $ \<\>バックスラッシュなしでサポート
  • 短縮文字[ \b\s等]なし

牛に似た一種の栄養ここにデフォルトの正規表現が追加されます。

  • \?文字を0回または1回繰り返し(sumc\?と一致)ccc\{0,1\}
  • \+文字を1回以上繰り返し(c\+一致ccなどcccccccc)、代替文字です。\{1,\}

  • \|サポート(例:サポートをgrep a\|b探すab

grep -E完全な拡張正規表現セットを使用するようにコマンドを有効にします。


拡張正規表現[ERE]

egrepawkおよびの場合、emacs基本セットにいくつかの機能が追加されました。

  • メタ文字はバックスラッシュによって無効になります。
  • 逆参照なし
  • else:一般的にできる魔法のような正規表現がたくさんあります。

牛に似た一種の栄養拡張正規表現

次の機能を追加してください

これら2つのリンクは、私がここで受け取った大きなサポートに加えて、本当に多くの有用な正規表現.infoにリンクされています。

答え4

他の人が役に立つと思うかもしれないので、私の解決策を紹介します。

ただ一致します<character>+(character)

z='foo_bar__yo___hak____woot_tut'
echo ${z//_+(_)}
foo_baryohakwoot_tut

さらに一歩進んで、次のように混合部分文字列を置き換えることができます。

z='foo_bar__yo___hak__-_woot_tut'
echo ${z//_+([-_])/_}
foo_bar_yo_hak_woot_tut

関連情報