sed正規表現をbbeに変換するには?

sed正規表現をbbeに変換するには?

このようにsedを実行しますが、bbeで一致/交換する方法:
echo "abc894576def559872364abc23948572348576def" |sed -r "s@(abc[0-9]).*(def)@\1CCC\2@"

なぜならこれは何もしないからです:
echo "abc894576def559872364abc23948572348576def" |bbe -e "s@(abc[0-9]).*(def)@\1CCC\2@"

改行文字を無視する必要があるため必要ですbbe。つまり、区切り文字のように、バイナリで見つかった最後の一致ではなく、最初の一致として「def」が必要なので、正規表現はまだ良くありません。

答え1

-rあなたはこのオプションをあなたのオプションと一緒に使用しているので、拡張正規表現のためにこのオプションのGNU専用バージョン(GNU)をsed使用しています。したがって、達成したいものが改行文字も含む場合は、改行文字の代わりに区切り文字としてゼロバイトを使用するGNUオプションを使用してください。sed-r-EE.*-zsed

sed -zE "s@(abc[0-9]).*(def)@\1CCC\2@"

他のsedバージョンでは、次のようにパターン空間のすべての行を取得する必要があります。

sed -E "H;1h;$!d;x;s@(abc[0-9]).*(def)@\1CCC\2@"

これは、最後の行まで予約されたスペースのすべての行を収集し、バッファを交換してファイル全体を一度に処理します。ただし、大容量ファイルの場合は、バッファサイズの制限に注意してください。

次の問題は、最初のdef一致が必要なため、Perlの非greedy一致が必要です.*?が、1つもないsedため、ファイルに属さない文字を使用してこの問題を解決する必要があることです。 、#この例を挙げましょう。たとえば、次のようになります。

sed -zE "s@def@#@g;s@(abc[0-9]).[^#]*#@\1CCC#@;s@#@def@g"

パターンを単一の文字に置き換えると、逆方向の一致を使用して、探している文字[^#]以外のすべての文字を一致させることができます。存在すると確信している場合は、パターンの末尾にあるパターンをdef削除して置き換えることもできます。#

関連情報