मुझे हाल ही में कमांड-लाइन पर कुछ रेगेक्स से परेशानी हुई, और पाया कि बैकस्लैश के मिलान के लिए, विभिन्न अक्षरों का उपयोग किया जा सकता है। यह संख्या regex (कोई नहीं, एकल उद्धरण, दोहरे उद्धरण) के लिए उपयोग किए जाने वाले उद्धरण पर निर्भर करती है। मेरे मतलब के लिए निम्नलिखित बैश सत्र देखें:
echo "#ab\\cd" > file
grep -E ab\cd file
grep -E ab\\cd file
grep -E ab\\\cd file
grep -E ab\\\\cd file
#ab\cd
grep -E ab\\\\\cd file
#ab\cd
grep -E ab\\\\\\cd file
#ab\cd
grep -E ab\\\\\\\cd file
#ab\cd
grep -E ab\\\\\\\\cd file
grep -E "ab\cd" file
grep -E "ab\\cd" file
grep -E "ab\\\cd" file
#ab\cd
grep -E "ab\\\\cd" file
#ab\cd
grep -E "ab\\\\\cd" file
#ab\cd
grep -E "ab\\\\\\cd" file
#ab\cd
grep -E "ab\\\\\\\cd" file
grep -E 'ab\cd' file
grep -E 'ab\\cd' file
#ab\cd
grep -E 'ab\\\cd' file
#ab\cd
grep -E 'ab\\\\cd' file
इस का मतलब है कि:
- बिना उद्धरण के, मैं 4-7 वास्तविक बैकस्लैश के साथ एक बैकस्लैश का मिलान कर सकता हूं
- दोहरे उद्धरण चिह्नों के साथ, मैं 3-6 वास्तविक बैकस्लैश के साथ एक बैकस्लैश मिलान कर सकता हूं
- सिंगल कोट्स के साथ, मैं 2-3 वास्तविक बैकस्लैश के साथ एक बैकस्लैश का मिलान कर सकता हूं
मैं समझता हूं कि एक अतिरिक्त बैकस्लैश को शेल (बैश मैन पेज से) द्वारा अनदेखा किया जाता है:
"एक गैर-उद्धृत बैकस्लैश (\) एस्केप कैरेक्टर है। यह अगले साल के शाब्दिक मूल्य को सुरक्षित रखता है"
यह एकल-उद्धृत उदाहरणों पर लागू नहीं होता है, क्योंकि एकल उद्धरणों में कोई पलायन नहीं किया जाता है।
और एक अतिरिक्त बैकस्लैश को grep कमांड द्वारा अनदेखा किया जाता है ("\ c" सिर्फ "c" बच जाता है, लेकिन यह "c" के समान ही है, क्योंकि "c" का regex में विशेष अर्थ नहीं है)।
यह एकल उद्धरणों के साथ उदाहरण के व्यवहार की व्याख्या करता है, लेकिन मैं वास्तव में अन्य दो उदाहरणों को नहीं समझता हूं, खासकर इसलिए कि गैर-कोटेड डबल-उद्धृत स्ट्रिंग्स के बीच अंतर है।
फिर, बैश मैन पेज से एक उद्धरण:
"दोहरे उद्धरणों में वर्णों को जोड़ना, उद्धरणों के भीतर सभी वर्णों के शाब्दिक मूल्य को, $,`, \ _ और, के अपवाद के साथ सुरक्षित रखता है, जब इतिहास विस्तार सक्षम होता है; "।
मैंने awk /ab\cd/{print} file
एक ही परिणाम के साथ GNU awk (जैसे ) के साथ एक ही कोशिश की ।
हालाँकि, पर्ल अलग परिणाम दिखाता है (उदाहरण के लिए perl -ne
"/ab\\cd/"\&\&print file
):
- कोई उद्धरण के साथ, मैं 4-5 वास्तविक बैकस्लैश के साथ एक बैकस्लैश का मिलान कर सकता हूं
- दोहरे उद्धरण चिह्नों के साथ, मैं 3-4 वास्तविक बैकस्लैश के साथ एक बैकस्लैश का मिलान कर सकता हूं
- सिंगल कोट्स के साथ, मैं 2 वास्तविक बैकस्लैश के साथ एक बैकस्लैश का मिलान कर सकता हूं
क्या कोई समझा सकता है कि grep और awk के लिए कमांड-लाइन पर गैर-उद्धृत और डबल-qouted regex तार के बीच अंतर? मैं पर्ल के व्यवहार के स्पष्टीकरण में दिलचस्पी नहीं रखता, क्योंकि मैं आमतौर पर पर्ल वन-लाइनर्स का उपयोग नहीं करता हूं।
printf "\ntest"
"परीक्षण" से पहले एक नई पंक्ति सम्मिलित करेंगे, भले ही इसे शेल द्वारा"\n"
अनुवादित किया जाना चाहिए"n"
क्योंकि यह डबल उद्धरण है ... (इसलिए अपेक्षित परिणाम होना चाहिए, के लिए) "एनटेस्ट", "नेस्टेस्ट"। हमें लिखने की आदत डालनी चाहिए:printf "\\ntest"
याprintf '\ntest'
, लेकिन किसी तरह मुझे इसके बजाय विषमता पर भरोसा करने वाली बहुत सारी स्क्रिप्ट दिखाई देती है।