2012-02-23 18 views
52

मुझे एक PHP चर $someVar खोजने की आवश्यकता है। हालांकि, गरेप सोचता है कि मैं एक regex को चलाने के लिए कोशिश कर रहा हूँ और शिकायत कर रहा है:Grep नियमित अभिव्यक्ति के रूप में नहीं

$ grep -ir "Something Here" * | grep $someVar 
Usage: grep [OPTION]... PATTERN [FILE]... 
Try `grep --help' for more information. 
$ grep -ir "Something Here" * | grep "$someVar" 
<<Here it returns all rows with "someVar", not only those with "$someVar">> 

मैं एक regex के रूप में स्ट्रिंग व्याख्या करने के लिए ग्रेप नहीं बताने के लिए एक विकल्प दिखाई नहीं देता है, लेकिन $ के रूप में शामिल करने के लिए बस एक और स्ट्रिंग चरित्र।

+0

इस प्रश्न में, मुख्य मुद्दा 'grep'' regex के रूप में '$' की व्याख्या करने के बारे में नहीं है। यह पर्यावरण चर 'someVar' के मूल्य के साथ '$ someVar' को प्रतिस्थापित करने के खोल के बारे में है, संभवतः खाली स्ट्रिंग। दूसरा उदाहरण 'कुछ वार' के साथ सभी पंक्तियों को वापस नहीं करना चाहिए, लेकिन सभी पंक्तियां, क्योंकि खाली स्ट्रिंग सभी लाइनों में है। विकल्प को प्रतिस्थापित करने के लिए खोल को बताने के लिए, आपको ''$ someVar' या' \ $ someVar' का उपयोग करना होगा। फिर आपको '$' चरित्र की 'grep' व्याख्या से निपटना होगा। –

+1

@ क्रिस्टोफडेवेट-ड्रोगुएट: स्पष्टीकरण के लिए धन्यवाद, मैं डाउनवोट के रूप में परेशान था! आपकी टिप्पणी उत्तर देने के लिए पर्याप्त जानकारीपूर्ण है, वास्तव में यह पृष्ठ पर बेहतर उत्तरों में से एक होगा यदि ऐसा है। – dotancohen

उत्तर

7

$ से आगे \ डालने से बचें।

+4

या, '... | grep '$ someVar'' –

188

उपयोग fgrep (बहिष्कृत), grep -F या grep --fixed-strings, यह भी निश्चित स्ट्रिंग की एक सूची के रूप में पैटर्न का इलाज, एक regex के बजाय बनाने के लिए।

संदर्भ के लिए, प्रलेखन का उल्लेख है (अंश):

-F--fixed-strings तय तार (नियमित अभिव्यक्ति के बजाय), नई पंक्तियों द्वारा अलग की एक सूची के रूप में पैटर्न, जिनमें से किसी भी होना है व्याख्या मिलान नहीं हुआ। (-एफ को POSIX द्वारा निर्दिष्ट किया गया है।)

fgrepgrep -F जैसा ही है। Fgrep के रूप में प्रत्यक्ष आमंत्रण बहिष्कृत है, लेकिन ऐतिहासिक अनुप्रयोगों को अनुमति देने के लिए प्रदान किया जाता है जो पर असम्बद्ध चलाने के लिए भरोसा करते हैं।

पूरा संदर्भ के लिए, की जाँच करें: https://www.gnu.org/savannah-checkouts/gnu/grep/manual/grep.html

+17

यह स्वीकार्य उत्तर होना चाहिए। –

+0

सरल महान जवाब। – breadmj

+0

सहमत हैं- जब आप चर का उपयोग कर रहे हैं तो आप बैश में PHP की 'addlashes()' जैसे कुछ नहीं कर सकते हैं। यह करने का यह सबसे आसान तरीका है। – geerlingguy

43

grep -F एक मानक तरीका एक निश्चित स्ट्रिंग, नहीं एक पैटर्न के रूप में तर्क की व्याख्या करने के grep बताने के लिए है।

+1

गंभीरता से, यह स्वीकार्य उत्तर होना चाहिए था! – dotslash

+0

अच्छा जवाब। जब मैंने ssh कमांड का उपयोग कर $ स्ट्रिंग की खोज की तो यह मेरी समस्या हल हो गई। "\" से बचने से उस परिदृश्य में काम नहीं हुआ। लेकिन -एफ झंडा चाल चल रहा था। – Rajasekhar

7

आप grep आप एक पैटर्न के बजाय, एक निश्चित स्ट्रिंग का उपयोग, का उपयोग करते हुए यह बताने के लिए है 'एफ':

grep -ir "Something Here" * | grep -F \$somevar 
1

इस सवाल में, मुख्य मुद्दे के बारे में grep एक regex के रूप में $ की व्याख्या नहीं है । यह $someVar पर्यावरण परिवर्तनीय someVar के मूल्य के साथ, खाली स्ट्रिंग की संभावना के साथ खोल को प्रतिस्थापित करने के बारे में है।

तो पहले उदाहरण में, यह किसी भी तर्क के बिना grep पर कॉल करने जैसा है, और यही कारण है कि यह आपको usage आउटपुट देता है। दूसरा उदाहरण someVar वाली सभी पंक्तियों को वापस नहीं करना चाहिए, लेकिन सभी पंक्तियां, क्योंकि खाली स्ट्रिंग सभी पंक्तियों में है।

विकल्प को बदलने के लिए खोल को बताने के लिए, आपको '$someVar' या \$someVar का उपयोग करना होगा। तो आपको $ चरित्र की grep व्याख्या से निपटना होगा, इसलिए grep -F विकल्प कई अन्य उत्तरों में दिया गया है।

तो एक वैध जवाब होगा:

grep -ir "Something Here" * | grep '$someVar' 
1

+1 -F विकल्प के लिए, इसे स्वीकार कर लिया जवाब होगा। इसके अलावा, मेरी फ़ाइलों में -I.. पैटर्न की खोज करते समय मेरे पास "अजीब" व्यवहार था, क्योंकि -I को grep का विकल्प माना गया था; ऐसी त्रुटियों से बचने के लिए, हम -- का उपयोग कर कमांड के तर्कों के अंत को स्पष्ट रूप से निर्दिष्ट कर सकते हैं।

उदाहरण:

grep -HnrF -- <pattern> <files> 

आशा है कि किसी की मदद करेंगे।

+0

क्या एफ के लिए खड़ा है? –

+0

http://www.gnu.org/software/grep/manual/grep.html से: "-एफ: पैटर्न को स्ट्रिंग्स (नियमित अभिव्यक्तियों के बजाय) की सूची के रूप में व्याख्या करें, जो न्यूलाइन द्वारा अलग किया गया है, इनमें से कोई भी है मिलान करने के लिए। (-एफ को POSIX द्वारा निर्दिष्ट किया गया है।) " –

+0

यदि' --' का उपयोग किया जाता है, तो '-HnrF' छोड़ा जा सकता है? – Daniel

संबंधित मुद्दे