Chris Down pokazał już, w jaki sposób można uzyskać wyrażenie regularne za pomocą wyrażenia „jeśli” w bloku. Możesz uzyskać ten sam efekt także na inne sposoby, chociaż jego rozwiązanie jest prawdopodobnie lepsze.
Jednym z nich jest napisanie trzeciego wyrażenia regularnego, które będzie pasowało tylko do tekstu niepasującego do innych, w twoim przypadku wyglądałoby to mniej więcej tak:
awk '/^R1/ { print "=>" $0}
/^R2/ { print "*" $0}
/^[^R]/ || /^R[^12]/ { print $0 } '
Uwaga: używa to zakotwiczonych wyrażeń regularnych - ^ na początku wyrażeń regularnych będzie pasować tylko na początku wiersza - oryginalne wzorce tego nie zrobiły, co spowalnia nieco dopasowanie, ponieważ sprawdza wszystkie znaki w wierszu, a nie przeskakując do następnej linii. Trzeci przypadek („else”) będzie pasował do linii, która zaczyna się od znaku, który nie jest „R” ([^ R]) lub zaczyna się od „R”, po którym następuje znak, który nie jest „1” lub „ 2 '(R [^ 12]). Dwa różne znaczenia ^ są nieco mylące, ale ten błąd został popełniony dawno temu i nie zostanie zmieniony w najbliższym czasie.
Aby użyć uzupełniających wyrażeń regularnych, naprawdę muszą być zakotwiczone, ponieważ w przeciwnym razie [^ R] pasowałby np. 1 za nim. W przypadku bardzo prostych wyrażeń regularnych, takich jak Ty, takie podejście może być przydatne, ale gdy wyrażenia regularne stają się bardziej złożone, podejście to stanie się niemożliwe do zarządzania. Zamiast tego możesz użyć zmiennych stanu dla każdej linii, na przykład:
awk '{ handled = 0 }
/^R1/ { print "=>" $0; handled = 1}
/^R2/ { print "*" $0; handled = 1}
{ if (!handled) print $0 } '
Ustawia się to na zero dla każdej nowej linii, a następnie na 1, jeśli pasuje do jednego z dwóch wyrażeń regularnych, i na koniec, jeśli wciąż jest zero, wykonuje wydruk 0 $.