Nein, sed reguläre Ausdrücke haben keine nicht gierigen Übereinstimmungen.
Sie können den gesamten Text bis zum ersten Auftreten von AC
abgleichen, indem Sie "alles , was nichts enthält AC
" gefolgt von verwenden AC
. Dies entspricht dem von Perl .*?AC
. Die Sache ist, dass „alles, was nichts enthält AC
“ nicht einfach als regulärer Ausdruck ausgedrückt werden kann: Es gibt immer einen regulären Ausdruck, der die Negation eines regulären Ausdrucks erkennt, aber der Negations-Regex wird schnell kompliziert. Und in portablem sed ist dies überhaupt nicht möglich, da der Negations-Regex die Gruppierung einer Alternative erfordert, die in erweiterten regulären Ausdrücken (z. B. in awk), aber nicht in portablen regulären Grundausdrücken vorhanden ist. Einige Versionen von sed, wie GNU sed, haben Erweiterungen für BRE, mit denen alle möglichen regulären Ausdrücke ausgedrückt werden können.
sed 's/AB\([^A]*\|A[^C]\)*A*AC/XXX/'
Aufgrund der Schwierigkeit, einen regulären Ausdruck zu negieren, lässt sich dies nicht gut verallgemeinern. Stattdessen können Sie die Linie vorübergehend transformieren. In einigen sed-Implementierungen können Sie Zeilenumbrüche als Marker verwenden, da diese nicht in einer Eingabezeile angezeigt werden können (und wenn Sie mehrere Marker benötigen, verwenden Sie Zeilenumbrüche gefolgt von einem unterschiedlichen Zeichen).
sed -e 's/AC/\
&/g' -e 's/AB[^\
]*\nAC/XXX/' -e 's/\n//g'
Beachten Sie jedoch, dass Backslash-Newline in einigen sed-Versionen in einem Zeichensatz nicht funktioniert. Dies funktioniert insbesondere nicht in GNU sed, der sed-Implementierung unter nicht eingebettetem Linux. in GNU sed können Sie \n
stattdessen verwenden:
sed -e 's/AC/\
&/g' -e 's/AB[^\n]*\nAC/XXX/' -e 's/\n//g'
In diesem speziellen Fall reicht es aus, die erste AC
Zeile durch eine neue zu ersetzen . Der Ansatz, den ich oben vorgestellt habe, ist allgemeiner.
Ein leistungsfähigerer Ansatz in sed besteht darin, die Linie im Haltebereich zu speichern, alle bis auf den ersten „interessanten“ Teil der Linie zu entfernen, den Haltebereich und den Musterbereich auszutauschen oder den Musterbereich an den Haltebereich anzuhängen und zu wiederholen. Wenn Sie jedoch anfangen, so komplizierte Dinge zu tun, sollten Sie sich wirklich überlegen, auf awk umzusteigen. Awk hat auch keine nicht gierigen Übereinstimmungen, aber Sie können eine Zeichenfolge teilen und die Teile in Variablen speichern.