Chris Down a déjà montré comment obtenir un autre pour les expressions rationnelles en utilisant une instruction explicite «if» dans un bloc. Vous pouvez également obtenir le même effet d'une autre manière, bien que sa solution soit probablement meilleure.
La première consiste à écrire une troisième expression régulière qui ne correspondra qu'au texte qui ne correspond pas aux autres, dans votre cas, cela ressemblerait à ceci:
awk '/^R1/ { print "=>" $0}
/^R2/ { print "*" $0}
/^[^R]/ || /^R[^12]/ { print $0 } '
Remarque, cela utilise des expressions rationnelles ancrées - le ^ au début des expressions régulières ne correspondra qu'au début d'une ligne - vos modèles originaux ne l'ont pas fait, ce qui ralentit légèrement la correspondance car il vérifiera tous les caractères sur une ligne plutôt que sauter jusqu'à la ligne suivante. Le troisième cas ("else") correspondra à une ligne qui commence par un caractère qui n'est pas 'R' ([^ R]) ou qui commence par un 'R' suivi d'un caractère qui n'est pas un '1' ou ' 2 '(R [^ 12]). Les deux significations différentes de ^ sont quelque peu déroutantes, mais cette erreur a été commise il y a longtemps et ne sera pas modifiée de si tôt.
Pour utiliser des expressions rationnelles complémentaires, elles doivent vraiment être ancrées, sinon le [^ R] correspondrait par exemple au 1 qui le suit. Pour les regexps très simples comme vous, cette approche peut être utile, mais à mesure que les regexps deviennent plus complexes, cette approche deviendra ingérable. Au lieu de cela, vous pouvez utiliser des variables d'état pour chaque ligne, comme ceci:
awk '{ handled = 0 }
/^R1/ { print "=>" $0; handled = 1}
/^R2/ { print "*" $0; handled = 1}
{ if (!handled) print $0 } '
Cela met à zéro géré pour chaque nouvelle ligne, puis à 1 si elle correspond à l'un des deux regexps, et enfin, si elle est toujours nulle, exécute l'impression $ 0.