このように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
-E
E
.*
-z
sed
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
削除して置き換えることもできます。#