Крис Даун уже показал, как можно получить другое выражение для регулярных выражений, используя явный оператор if в блоке. Вы также можете получить тот же эффект в некоторых других отношениях, хотя его решение, вероятно, лучше.
Одним из них является написание третьего регулярного выражения, которое будет соответствовать только тексту, который не соответствует другим, в вашем случае это будет выглядеть примерно так:
awk '/^R1/ { print "=>" $0}
/^R2/ { print "*" $0}
/^[^R]/ || /^R[^12]/ { print $0 } '
Обратите внимание, что здесь используются привязанные регулярные выражения - символ ^ в начале регулярного выражения будет совпадать только в начале строки - ваши исходные шаблоны этого не делали, что немного замедляет сопоставление, так как будет проверять все символы в строке, а не пропуская до следующей строки. Третий случай («else») будет соответствовать строке, которая начинается с некоторого символа, который не является «R» ([^ R]) или начинается с «R», за которым следует символ, который не является «1» или « 2 '(R [^ 12]). Два разных значения ^ несколько сбивают с толку, но эта ошибка была допущена давно и не будет изменена в ближайшее время.
Чтобы использовать дополнительные регулярные выражения, они действительно должны быть привязаны, так как в противном случае [^ R] будет соответствовать, например, 1 после него. Для очень простых регулярных выражений, таких как у вас, этот подход может быть полезен, но по мере усложнения регулярных выражений этот подход станет неуправляемым. Вместо этого вы можете использовать переменные состояния для каждой строки, например так:
awk '{ handled = 0 }
/^R1/ { print "=>" $0; handled = 1}
/^R2/ { print "*" $0; handled = 1}
{ if (!handled) print $0 } '
Это устанавливает обработанный ноль для каждой новой строки, затем 1, если он совпадает с любым из двух регулярных выражений, и, наконец, если он все еще равен нулю, выполняет печать $ 0.