Кріс Даун вже показав, як можна отримати інше для регулярних виразів, скориставшись явним твердженням "якщо" в блоці. Можна отримати такий же ефект і іншими способами, хоча його рішення, мабуть, краще.
Одне полягає в тому, щоб написати третій регулярний вираз, який буде відповідати лише тексту, який не відповідає іншим; у вашому випадку це виглядатиме приблизно так:
awk '/^R1/ { print "=>" $0}
/^R2/ { print "*" $0}
/^[^R]/ || /^R[^12]/ { print $0 } '
Зауважте, для цього використовується прив’язаний регулярний вираз - ^ на початку регулярних виразів збігатиметься лише на початку рядка - ваші оригінальні шаблони цього не робили, що трохи сповільнює збіг, оскільки він перевірятиме всі символи в рядку, а не пропускаючи до наступного рядка. Третій (інший) випадок буде відповідати рядку, який починається з символу, який не є '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.