Chris Down zaten bir bloktaki ifadeyi açık 'if' ifadesini kullanarak regexps için başka bir yoldan nasıl alabileceğinizi gösterdi. Çözümü muhtemelen daha iyi olmasına rağmen, aynı etkiyi başka yollardan da alabilirsiniz.
Birincisi, sadece diğerleri tarafından eşleştirilmeyen metinlerle eşleşecek üçüncü bir regex yazmak, sizin durumunuzda, bu şöyle görünür:
awk '/^R1/ { print "=>" $0}
/^R2/ { print "*" $0}
/^[^R]/ || /^R[^12]/ { print $0 } '
Not: bu, sabitlenmiş regexps kullanır - regexps'in başında ^ yalnızca bir satırın başında eşleşir - orijinal desenleriniz bunu yapmadı; bu, eşleştirmeyi bir satırdaki tüm karakterleri kontrol etmek yerine hafifçe yavaşlatır. sonraki satıra kadar atlama. Üçüncü ("else") durumu, 'R' ([^ R]) olmayan bir karakterle başlayan veya 'R' ile başlayan ve ardından '1' veya 'olmayan bir karakterle başlayan bir çizgiyle eşleşir. 2 '(R [^ 12]). ^ 'Nin iki farklı anlamı biraz kafa karıştırıcıdır, ancak bu hata uzun zaman önce yapıldı ve yakın zamanda değişmeyecek.
Tamamlayıcı regexps kullanmak için, gerçekten bağlanması gerekir, aksi takdirde [^ R] örneğin 1'i eşleştirir. Sizin gibi çok basit regexps için bu yaklaşım faydalı olabilir, ancak regexps daha karmaşık hale geldikçe, bu yaklaşım yönetilemez hale gelecektir. Bunun yerine, her satır için durum değişkenlerini kullanabilirsiniz, bunun gibi:
awk '{ handled = 0 }
/^R1/ { print "=>" $0; handled = 1}
/^R2/ { print "*" $0; handled = 1}
{ if (!handled) print $0 } '
Bu ayarlar, her yeni satır için sıfıra, ardından iki regexps'den biriyle eşleşirse 1'e işlenir ve son olarak hala sıfırsa, $ 0 yazdırmasını gerçekleştirir.