コマンドライン(Bash)で、テキスト、リストなどの二重文字のすべての出現を検出する正規表現を探しています。
主な質問:aa
、ll
、ttttt
などのシーケンスを探す簡単な方法はありますか。同じキャラクターの?私が探しているのは、非常に基本的なレベルでこれを達成することです。コマンドライン。 Linuxシェル。
かなりの調査の後、私は次の答えにたどり着きました–そしてそれらから生じる質問、そしてそれゆえ彼らは私に解決策がどこにあるのかについてのヒントを与えてくれました。だが:
a)(e)grepとバックスラッシュの問題
grep 'a\{2\}'
はaa
を探しますegrep'a{2}'
はaa
を探します質問:バックラッシュを設定する必要性は、実際に使用するコマンドにバインドされていますか?もしそうなら、誰かがここで(e)grepを使用するときに考慮すべき他のことを教えてくれますか?
b)私は この答えはここ を私の質問に見つけましたが、それは私が探していたものとは正確ではありません:
grep -E '(.)\1' filename
は、同じ文字が複数回出現するエントリを探しますが、は、頻度を尋ねません。これは私が探しているものに近いですが、繰り返しの数を設定したいと思っています。
私はおそらくこれを2つ以上の質問に分割する必要がありますが、この素晴らしいサイトをここに溢れさせたくありません。
PS:別の質問、おそらくトピック外ですが、それはin
、inside
、at
、またはon the Shell
ですか。そしてon the command line
は正しいですか?
これは本当に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で試してみましたが、そこで機能しますが、他の一部の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はアレクシスが示されているため間違っているため、無視してください。
最初に、支持するコメントと提案をありがとうございました。結局、私はすでに答えにかなり近づいていました。
主な問題は約でした:
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
回繰り返します。
したがって、結果として、二次的な問題が発生しました:
使用するコマンドにバックラッシュを設定する必要はありますか?
短い回答:はい、バックスラッシュの使用は、grep
とegrep
のどちらを使用するかによって異なります
grep
:バックスラッシュはメタ文字をアクティブにします[基本的な正規表現を使用します]egrep
バックスラッシュde-メタ文字をアクティブ化[拡張正規表現を使用]これは短い答えなので、同等の問題に遭遇した人に提供したいので、grep
とegrep
を使用して、一見注意する必要があることの基本的な概要を追加しました。
基本的な正規表現
grep
、ed
、sed
コマンドで使用
基本的な正規表現セットの機能は次のとおりです。
? [ . \ )
_などは、バックスラッシュでアクティブ化されます。バックスラッシュがない場合、それらは検索語(の一部)として使用されます。^ $ \<
_および_\>
_は、バックスラッシュなしでサポートされています\b
_、_\s
_など][〜#〜] gnu [〜#〜]基本正規表現はこれらに追加します
\?
_文字を0回または1回繰り返し(_c\?
_はc
and cc
と一致)、_\{0,1\}
_の代替です_\+
_文字を少なくとも1回繰り返し(_c\+
_はcc
、cccccccc
などと一致します)、_\{1,\}
_の代替です
_\|
_がサポートされています(例:_grep a\|b
_はa
またはb
を検索します
_grep -E
_は、コマンドが拡張正規表現のセット全体を使用できるようにします。
拡張正規表現[ERE]
egrep
、awk
、およびemacs
で使用されるのは、基本セットといくつかの機能です。
[〜#〜] gnu [〜#〜]拡張正規表現
次の機能を追加します
2つのリンクは1つをregular-expressions.infoに誘導します。これは、私がここで得たすごいサポートに加えて、本当に非常に役立ちました。