いいえ、sed正規表現には貪欲でないマッチングはありません。
あなたは、最初の発生にすべてのテキストを一致させることができAC
、「含有していない何も使用してAC
続く」をAC
Perlのと同じ処理を行い、.*?AC
。問題は、「を含まAC
ないもの」は正規表現として簡単に表現できないことです。正規表現の否定を認識する正規表現は常に存在しますが、否定の正規表現はすぐに複雑になります。そして、ポータブルsedでは、これはまったく不可能です。否定正規表現では、拡張正規表現(awkなど)に存在するが、ポータブル基本正規表現にはない代替をグループ化する必要があるためです。GNU sedなどのsedの一部のバージョンには、可能なすべての正規表現を表現できるようにするBREの拡張機能があります。
sed 's/AB\([^A]*\|A[^C]\)*A*AC/XXX/'
正規表現を否定するのは難しいため、これはうまく一般化されません。代わりにできることは、一時的に行を変換することです。一部のsed実装では、改行は入力行に表示できないため、マーカーとして使用できます(複数のマーカーが必要な場合は、改行の後にさまざまな文字を使用します)。
sed -e 's/AC/\
&/g' -e 's/AB[^\
]*\nAC/XXX/' -e 's/\n//g'
ただし、一部のsedバージョンの文字セットではバックスラッシュ改行が機能しないことに注意してください。特に、これはGNU sedでは機能しません。GNUsedは非組み込みLinuxでのsed実装です。GNU sed \n
では、代わりに使用できます:
sed -e 's/AC/\
&/g' -e 's/AB[^\n]*\nAC/XXX/' -e 's/\n//g'
この特定のケースでは、最初AC
の行を改行で置き換えるだけで十分です。上記のアプローチはより一般的です。
sedのより強力なアプローチは、ラインをホールドスペースに保存し、ラインの最初の「興味深い」部分を除くすべてを削除し、ホールドスペースとパターンスペースを交換するか、パターンスペースをホールドスペースに追加して繰り返すことです。ただし、これほど複雑なことを始めた場合は、awkへの切り替えを検討する必要があります。Awkにも欲張りでないマッチングはありませんが、文字列を分割して、その部分を変数に保存できます。