正規表現(基本正規表現のみ)を使用してgrepでシフトを達成するには?

正規表現(基本正規表現のみ)を使用してgrepでシフトを達成するには?

私はERE(拡張正規表現)しか使用できないので、この質問はあまり意味がないことを知っています。しかし、当分の間は、交換を実装することが唯一の選択肢です。 BREのみを使用してどのように実装できますか?それとも回避策を見つける必要がありますか?

次の文字列があるとしましょう。

AAAAAA======-----======AAAAAAAAA

私の目標は、基本正規表現のみを使用して、AAAAA、======、-----、======、およびAAAAAAAAAをそれぞれ一致させることです。これはEREを使用してすばやく実行できますが、BREでのみこれを行う方法を知りたいです。これまで、一致するいくつかの文字列が互いに重なり合わず(たとえば、「AAAAA ==」と一致する正規表現は発生しないでください)、これを実行する適切な方法が見つかりません。

答え1

簡単です:それはすべてです。いいえBREは交互に

POSIX BREは他の機能をサポートしていません。代替もサポートされていません。

あなたの基本的な目標:

今私の目標は...それぞれ...基本正規表現と一致させることです。

BREが利用可能です:

$ str='AAAAAA======-----======AAAAAAAAA'
$ echo "$str" | grep -Eo '(.)\1*'
AAAAAA
======
-----
======
AAAAAAAAA

あるいは、BRE grep で複数のパターンを使用することもできます。

$ echo "$str" | grep -o -e 'AA*' -e '--*' -e '==*'
AAAAAA
======
-----
======
AAAAAAAAA

または、ソリューションをGNU grepに制限します(\|BRE構文でもシフトが許可されていますが、これは有効なPOSIX機能ではありません)。

$ echo "$str" | grep -o '\(AA*\)\|\(==*\)\|\(--*\)'

しかし、2番目の目標は次のとおりです。

別のキャプチャグループに追加できますか?

ただ聞いてください一つ正規表現であり、BREでは置換が不可能であるため不可能です。

BREのシフトの良い説明

答え2

繰り返される文字を含む文字列と一致します。基本正規表現:

$ echo 'AAAAAA======-----======AAAAAAAAA' | grep -o '\(.\)\1*'
AAAAAA
======
-----
======
AAAAAAAAA

.すべての文字と一致します。 \(.\)任意の文字と一致し、その文字をキャプチャグループ1に保存します。 \1*同じ文字が異なる場合と一致します。

\1BREは、次の逆参照の使用をサポートしています。POSIX

関連情報