क्रिस डाउन ने पहले ही दिखाया कि आप किसी ब्लॉक में 'स्पष्ट' कथन का उपयोग करके रीजैक्स के लिए और कैसे प्राप्त कर सकते हैं। आप कुछ अन्य तरीकों से भी समान प्रभाव प्राप्त कर सकते हैं, हालांकि उसका समाधान संभवतः बेहतर है।
एक तीसरा रेगेक्स लिखना है जो केवल पाठ से मेल खाएगा दूसरों से मेल नहीं खाता है, आपके मामले में, यह कुछ इस तरह दिखाई देगा:
awk '/^R1/ { print "=>" $0}
/^R2/ { print "*" $0}
/^[^R]/ || /^R[^12]/ { print $0 } '
ध्यान दें, यह एंकरेड रेग्जैप्स का उपयोग करता है - ^ रेगेक्स की शुरुआत में ^ केवल एक लाइन की शुरुआत में मेल खाएगा - आपके मूल पैटर्न ने ऐसा नहीं किया, जो मिलान को थोड़ा धीमा कर देता है क्योंकि यह एक लाइन पर सभी वर्णों की जांच करेगा। अगली पंक्ति तक लंघन। तीसरा ("और") मामला एक ऐसी रेखा से मेल खाता है जो किसी ऐसे वर्ण से शुरू होता है जो 'R' ([^ R]) नहीं है या जो कि 'R' से शुरू होता है और उसके बाद एक वर्ण '1' या ' 2 '(आर [^ 12])। ^ के दो अलग-अलग अर्थ कुछ भ्रमित करने वाले हैं, लेकिन यह गलती बहुत समय पहले की गई थी और जल्द ही इसे कभी भी नहीं बदला जाएगा।
पूरक रेग्जाप्स का उपयोग करने के लिए, उन्हें वास्तव में एंकरिंग करने की आवश्यकता होती है, अन्यथा अन्यथा [^ R] 1 के बाद से मेल खाएगा। आपके जैसे बहुत ही सरल रीजैक्स के लिए, यह दृष्टिकोण उपयोगी हो सकता है, लेकिन जैसे-जैसे रेक्सएक्सप्स अधिक जटिल होते जाते हैं, यह दृष्टिकोण असहनीय हो जाएगा। इसके बजाय, आप प्रत्येक पंक्ति के लिए राज्य चर का उपयोग कर सकते हैं, जैसे:
awk '{ handled = 0 }
/^R1/ { print "=>" $0; handled = 1}
/^R2/ { print "*" $0; handled = 1}
{ if (!handled) print $0 } '
यह सेट प्रत्येक नई पंक्ति के लिए शून्य पर संभाला जाता है, फिर 1 पर अगर यह दोनों रीगेक्स में से किसी एक से मेल खाता है, और अंत में, यदि यह अभी भी शून्य है, तो प्रिंट $ 0 को निष्पादित करता है।