Chris Down ได้แสดงให้เห็นแล้วว่าคุณสามารถรับ regexps ได้อย่างไรโดยใช้คำสั่ง 'if' ในบล็อกอย่างชัดเจน คุณสามารถได้รับผลเช่นเดียวกันในบางวิธีแม้ว่าวิธีแก้ปัญหาของเขาอาจจะดีกว่า
หนึ่งคือการเขียน regex ที่สามที่จะตรงกับข้อความที่ไม่ตรงกับคนอื่น ๆ ในกรณีของคุณนี้จะมีลักษณะดังนี้
awk '/^R1/ { print "=>" $0}
/^R2/ { print "*" $0}
/^[^R]/ || /^R[^12]/ { print $0 } '
หมายเหตุสิ่งนี้ใช้ regexps ที่ยึดไว้ - ^ ที่จุดเริ่มต้นของ regexps จะจับคู่ที่จุดเริ่มต้นของบรรทัดเท่านั้น - รูปแบบดั้งเดิมของคุณไม่ได้ทำเช่นนี้ซึ่งช้ากว่าการจับคู่เล็กน้อยเนื่องจากมันจะตรวจสอบอักขระทั้งหมดในบรรทัดมากกว่า ข้ามไปจนถึงบรรทัดถัดไป กรณีที่สาม ("else") จะตรงกับบรรทัดที่ขึ้นต้นด้วยอักขระบางตัวที่ไม่ใช่ 'R' ([^ R]) หรือที่ขึ้นต้นด้วย 'R' ตามด้วยอักขระที่ไม่ใช่ '1' หรือ ' 2 '(R [^ 12]) ^ ความหมายที่แตกต่างกันสองอย่างของ ^ ค่อนข้างสับสน แต่ความผิดพลาดนั้นทำมานานแล้วและจะไม่เปลี่ยนแปลงในไม่ช้า
ในการใช้ regexps เสริมพวกเขาจำเป็นต้องได้รับการยึดจริงมิฉะนั้น [^ R] จะจับคู่เช่น 1 ที่ตามมา สำหรับ regexps ง่าย ๆ อย่างที่คุณมีวิธีนี้จะมีประโยชน์ แต่เมื่อ regexps มีความซับซ้อนมากขึ้นวิธีนี้จะไม่สามารถจัดการได้ แต่คุณสามารถใช้ตัวแปรสถานะสำหรับแต่ละบรรทัดเช่นนี้
awk '{ handled = 0 }
/^R1/ { print "=>" $0; handled = 1}
/^R2/ { print "*" $0; handled = 1}
{ if (!handled) print $0 } '
ชุดนี้จัดการให้เป็นศูนย์สำหรับแต่ละบรรทัดใหม่จากนั้นเป็น 1 หากตรงกับหนึ่งในสอง regexps และในที่สุดหากยังคงเป็นศูนย์ดำเนินการพิมพ์ $ 0