एकल-उद्धरण का उपयोग कब करें, grep में डबल-उद्धरण?


20

एक फ़ाइल में एक सरल पैटर्न "हैलो" की खोज करने की कोशिश करते हुए, grep के सभी निम्न कार्य काम करते हैं:

  • grep हैलो file1
  • grep 'हैलो' file1
  • grep "हैलो" file1

क्या कोई विशिष्ट मामला है जहां उपरोक्त रूपों में से एक काम करता है लेकिन अन्य नहीं करते हैं। अगर मुझे दूसरे के स्थान पर एक का उपयोग करने से कोई फर्क पड़ता है?

जवाबों:


25

यह वास्तव में आपके शेल पर निर्भर है। उद्धरण (या तो प्रकार) मुख्य रूप से व्हाट्सएप से निपटने के लिए हैं। उदाहरण के लिए, निम्नलिखित:

grep hello world file1

"दुनिया" और "file1" नामक फाइलों में "हैलो" शब्द की तलाश करेंगे, जबकि

grep "hello world" file1

फ़ाइल 1 में "हैलो वर्ल्ड" की तलाश करेंगे।

एकल या दोहरे उद्धरण चिह्नों के बीच चयन केवल तभी महत्वपूर्ण है जब खोज स्ट्रिंग में चर या अन्य आइटम होते हैं जिनकी आप मूल्यांकन करने की अपेक्षा करते हैं। एकल उद्धरण के साथ, स्ट्रिंग को शाब्दिक रूप से लिया जाता है और कोई विस्तार नहीं होता है। दोहरे उद्धरण चिह्नों के साथ, चर का विस्तार किया जाता है। उदाहरण के लिए (बॉश या ZSH जैसे बॉर्न-व्युत्पन्न शेल के साथ):

VAR="serverfault"
grep '$VAR' file1
grep "$VAR" file1

पहली grepफ़ाइल 1 में शाब्दिक स्ट्रिंग "$ VAR1" के लिए दिखेगा। दूसरा "$ VAR" चर का विस्तार करेगा और फ़ाइल 1 में स्ट्रिंग "सर्वरफ़ॉल्ट" की तलाश करेगा।


ध्यान देने योग्य बात यह है कि मूल प्रश्न में, वास्तव में हर बार सटीक तर्क दिए जा रहे हैं।
मिकीबी 17

2
वहां सावधानी बरतें। $एक नियमित अभिव्यक्ति के अंत में लाइन है, इसलिए $VAR1वास्तव में कुछ भी मेल नहीं खाना चाहिए। यह GNU grep पर काम करने के लिए होता है, लेकिन मैं अभी भी उस व्यवहार पर भरोसा नहीं करूंगा। आपको \$VAR1शाब्दिक स्ट्रिंग से सुरक्षित रूप से मेल खाना चाहिए। (और अगर आपको दोहरे उद्धरण चिह्नों में अतिरिक्त बैकस्लैम की आवश्यकता है।)
स्टीवन प्रिचर्ड

7

जेम्स सही है, लेकिन कुछ और डेटा जोड़ने के लिए, मुझे लगता है कि इसके बारे में सोचने का सबसे अच्छा तरीका कमांड के तर्क के रूप में है: क्या आप "हैलो" और "दुनिया" को दो तर्क या "हैलो वर्ल्ड" होने का इरादा रखते हैं बहस।

इसके अलावा, डबलक्वेओट केवल चर की तुलना में अधिक की व्याख्या की अनुमति देते हैं। वास्तव में आपके शेल पर क्या निर्भर करता है, लेकिन इतिहास विस्तार, ब्रेस विस्तार और फ़ाइल नाम विस्तार की जांच करें।

यह भी ध्यान रखना महत्वपूर्ण है कि कुछ उदाहरण हैं जहां आपको एक ही तर्क में दोनों प्रकार के उद्धरणों का उपयोग करने की आवश्यकता है। याद रखें कि (डिफ़ॉल्ट रूप से) तर्कों को व्हाट्सएप द्वारा सीमांकित किया जाता है, इसलिए यदि आप कोई स्थान नहीं छोड़ते हैं, तो आप अभी भी उसी तर्क को निर्दिष्ट कर रहे हैं।

अधिकांश गोले एकल एकल तंत्र किसी विशेष वर्ण के लिए अनुमति नहीं देते हैं, जिसका अर्थ है कि किसी अन्य एकल के किसी भी उदाहरण, भले ही वह बच जाए, उद्धरण समाप्त होता है। इसलिए एकल स्ट्रिंग के अंदर एक सिंगलकोट के साथ एक स्ट्रिंग पास करना असंभव है, और आपको डबलक्वाट का उपयोग करना होगा। यह एक दर्द हो सकता है जब आप एक तर्क पारित करना चाहते हैं जिसमें एकलक्वाट्स शामिल हैं और कुछ ऐसा है जिसकी व्याख्या की जाएगी, लेकिन आप नहीं बनना चाहते हैं। उदाहरण के लिए, यदि आप शाब्दिक स्ट्रिंग पास करना चाहते हैं "` '$ VAR' एक चर है ", तो आपको इसे इस तरह से करना होगा:

"'"'$VAR'"' is a variable"

यह वास्तव में तीन उद्धरण-बच गए तार का एक संयोजन है:

"'"
'$VAR'
"' is a variable"

या, हटाए गए उद्धरणों के साथ:

'
$VAR
' is a variable

दरअसल, ज्यादातर गोले के साथ, आप इसे इस तरह भी कर सकते हैं:

"'\$VAR' is a variable"

जहां बैकस्लैश (" \") शेल को निम्नलिखित चरित्र को शाब्दिक रूप से स्वीकार करने के लिए कहता है और उस पर कोई विस्तार नहीं करता है।

लेकिन कुछ उदाहरण हैं जहां आप इसे मल्टी-स्ट्रिंग-कॉन्सेप्टन तरीके से समाप्त करते हैं, ऐसा नहीं है कि मैं वास्तव में अभी एक उदाहरण के साथ आ सकता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.