コマンドライン(Bash)で、テキスト、リストなどのすべての二重文字を検索する正規表現を探しています。
主な問題:同じ文字がn回出てくるものを見つけるために正規表現を定義するなど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
答え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同じ文字が発生した場合(例
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
バックスラッシュダック-メタ文字を有効にする[拡張正規表現を使用]
grep
これは短い答えであり、同様の問題に直面した人々に助けを望んでいたので、人々が使用するときに注意する必要があると思われる事項の基本的な要約を追加しましたegrep
。
基本、拡張、GNU正規表現
基本正規表現
とコマンドに使用されますgrep
。ed
sed
デフォルトの正規表現セット関数は次のとおりです。
- ほとんどのメタ文字(例:
? [ . \ )
など)はバックスラッシュを通じて有効になります。バックスラッシュがない場合は、検索語(の一部)として扱われます。 ^ $ \<
\>
バックスラッシュなしでサポート- 短縮文字[
\b
、\s
等]なし
牛に似た一種の栄養ここにデフォルトの正規表現が追加されます。
\?
文字を0回または1回繰り返し(sumc\?
と一致)c
cc
\{0,1\}
\+
文字を1回以上繰り返し(c\+
一致cc
などcccccccc
)、代替文字です。\{1,\}
\|
サポート(例:サポートをgrep a\|b
探すa
b
grep -E
完全な拡張正規表現セットを使用するようにコマンドを有効にします。
拡張正規表現[ERE]
egrep
、awk
およびの場合、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