Chris Down sudah menunjukkan bagaimana Anda bisa mendapatkan yang lain untuk regexps dengan menggunakan pernyataan 'jika' eksplisit di blok. Anda juga bisa mendapatkan efek yang sama dengan beberapa cara lain, meskipun solusinya mungkin lebih baik.
Pertama adalah menulis regex ketiga yang hanya akan cocok dengan teks yang tidak cocok dengan yang lain, dalam kasus Anda, ini akan terlihat seperti ini:
awk '/^R1/ { print "=>" $0}
/^R2/ { print "*" $0}
/^[^R]/ || /^R[^12]/ { print $0 } '
Catatan, ini menggunakan regexps berlabuh - ^ di awal regexps hanya akan cocok pada awal baris - pola asli Anda tidak melakukan ini, yang memperlambat pencocokan sedikit karena akan memeriksa semua karakter pada baris daripada melewatkan hingga baris berikutnya. Kasus ketiga ("lain") akan cocok dengan garis yang dimulai dengan beberapa karakter yang bukan 'R' ([^ R]) atau yang dimulai dengan 'R' diikuti oleh karakter yang bukan '1' atau ' 2 '(R [^ 12]). Dua arti ^ yang berbeda agak membingungkan, tetapi kesalahan itu dibuat sejak lama dan tidak akan berubah dalam waktu dekat.
Untuk menggunakan regexps komplementer, mereka benar-benar perlu berlabuh, karena jika [^ R] akan cocok misalnya 1 yang mengikutinya. Untuk regexps yang sangat sederhana seperti yang Anda miliki, pendekatan ini bisa bermanfaat, tetapi ketika regexps menjadi lebih kompleks, pendekatan ini akan menjadi tidak terkelola. Sebagai gantinya, Anda dapat menggunakan variabel status untuk setiap baris, seperti ini:
awk '{ handled = 0 }
/^R1/ { print "=>" $0; handled = 1}
/^R2/ { print "*" $0; handled = 1}
{ if (!handled) print $0 } '
Set ini ditangani ke nol untuk setiap baris baru, lalu ke 1 jika cocok dengan salah satu dari kedua regexps, dan akhirnya, jika masih nol, jalankan cetakan $ 0.