Chris Down hat bereits gezeigt, wie Sie mithilfe einer expliziten 'if'-Anweisung in einem Block ein else für reguläre Ausdrücke erhalten können. Sie können den gleichen Effekt auch auf andere Weise erzielen, obwohl seine Lösung wahrscheinlich besser ist.
Eine besteht darin, einen dritten regulären Ausdruck zu schreiben, der nur mit Text übereinstimmt, der nicht von den anderen übereinstimmt. In Ihrem Fall würde dies ungefähr so aussehen:
awk '/^R1/ { print "=>" $0}
/^R2/ { print "*" $0}
/^[^R]/ || /^R[^12]/ { print $0 } '
Beachten Sie, dass dies verankerte reguläre Ausdrücke verwendet - das ^ am Anfang der regulären Ausdrücke stimmt nur mit dem Anfang einer Zeile überein - Ihre ursprünglichen Muster haben dies nicht getan, wodurch die Übereinstimmung etwas verlangsamt wird, da alle Zeichen in einer Zeile anstatt überprüft werden überspringen bis zur nächsten Zeile. Der dritte Fall ("else") stimmt mit einer Zeile überein, die mit einem Zeichen beginnt, das nicht "R" ([^ R]) ist, oder mit einem "R", gefolgt von einem Zeichen, das keine "1" oder "ist. 2 '(R [^ 12]). Die zwei unterschiedlichen Bedeutungen von ^ sind etwas verwirrend, aber dieser Fehler wurde vor langer Zeit begangen und wird in Kürze nicht mehr geändert.
Um komplementäre reguläre Ausdrücke verwenden zu können, müssen sie wirklich verankert sein, da sonst das [^ R] zB mit der darauf folgenden 1 übereinstimmt. Für sehr einfache reguläre Ausdrücke wie Sie kann dieser Ansatz nützlich sein, aber wenn die regulären Ausdrücke komplexer werden, kann dieser Ansatz nicht mehr verwaltet werden. Stattdessen können Sie Statusvariablen für jede Zeile wie folgt verwenden:
awk '{ handled = 0 }
/^R1/ { print "=>" $0; handled = 1}
/^R2/ { print "*" $0; handled = 1}
{ if (!handled) print $0 } '
Diese Einstellung setzt den Wert für jede neue Zeile auf Null, dann auf 1, wenn sie mit einer der beiden regulären Ausdrücke übereinstimmt, und führt schließlich, wenn sie immer noch Null ist, den Ausdruck $ 0 aus.