सबसे पहले, ध्यान दें कि एकल स्लैश बहुत अधिक मेल खाता है:
$ echo $'eegg \n e.g.' | grep e\.g\.
eegg
e.g.
जहां तक बाश की बात है, एक बची हुई अवधि एक अवधि के समान है। बैश grep की अवधि पर गुजरता है । Grep के लिए, एक अवधि कुछ भी मेल खाती है।
अब, विचार करें:
$ echo $'eegg \n e.g.' | grep e\\.g\\.
e.g.
$ echo $'eegg \n e.g.' | grep e\\\.g\\\.
e.g.
$ echo $'eegg \n e.g.' | grep e\\\\.g\\\\.
$
जब बैश एक डबल-स्लैश देखता है, तो इसे एक स्लैश में कम कर देता है और उस grep पर गुजरता है, जो ऊपर दिए गए तीन परीक्षणों में से पहले, देखता है, जैसा हम चाहते हैं, एक अवधि से पहले एकल स्लैश। इस प्रकार, यह सही काम करता है।
ट्रिपल स्लैश के साथ, बैश पहले दो को सिंगल स्लैश में घटा देता है। यह तो देखता है \.
। चूंकि एक बची हुई अवधि का बाश के लिए कोई विशेष अर्थ नहीं है, यह एक सादे अवधि तक कम हो जाता है। परिणाम यह है कि grep देखता है, जैसा कि हम चाहते हैं, एक अवधि से पहले स्लैश।
चार स्लैश के साथ, बैश प्रत्येक जोड़ी को एक स्लैश में कम कर देता है। बैश दो स्लेश और एक अवधि के लिए गुजरता है। ग्रेप दो स्लैश और अवधि को देखता है और एक भी करने के लिए दो स्लैश कम कर देता है शाब्दिक स्लेश। जब तक इनपुट में शाब्दिक स्लैश होता है तब तक किसी भी वर्ण का मिलान नहीं होता है।
उस अंतिम को समझाने के लिए, याद रखें कि एकल-उद्धरण के अंदर, सभी वर्ण शाब्दिक हैं। इस प्रकार, निम्नलिखित तीन इनपुट लाइनें दी गई हैं, grep कमांड इनपुट में शाब्दिक स्लैश के साथ लाइन पर मेल खाता है:
$ echo 'eegg
e.g.
e\.g\.' | grep e\\\\.g\\\\.
e\.g\.
बाश के व्यवहार का सारांश
बैश के लिए, नियम हैं
दो स्लैश एक स्लैश में कम हो जाते हैं।
एक सामान्य चरित्र के सामने एक स्लैश, जैसे एक अवधि, बस सामान्य चरित्र (अवधि) है।
इस प्रकार:
$ echo \. \\. \\\. \\\\.
. \. \. \\.
इस सभी भ्रम से बचने का एक सरल तरीका है: बैश कमांड लाइन पर, नियमित भावों को एकल-उद्धरणों में रखा जाना चाहिए। सिंगल कोट्स के अंदर, बैश सब कुछ अकेला छोड़ देता है।
$ echo '\. \\. \\\. \\\\.' # Note single-quotes
\. \\. \\\. \\\\.
\\\.
और grep देगा\.
लेकिन ऐसा नहीं है। अच्छा सवाल