नियमित अभिव्यक्ति के रूप में नहीं


96

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

$ 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">>

मुझे यह बताने के लिए विकल्प नहीं है कि grep को एक रेगेक्स के रूप में स्ट्रिंग की व्याख्या करने के लिए, लेकिन $सिर्फ एक और स्ट्रिंग चरित्र के रूप में शामिल करने के लिए ।


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

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

जवाबों:



299

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

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

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

fgrepके रूप में ही है grep -F। Fgrep के रूप में प्रत्यक्ष आह्वान को पदावनत किया जाता है, लेकिन ऐतिहासिक अनुप्रयोगों की अनुमति देने के लिए प्रदान किया जाता है जो उन पर भरोसा करते हैं जो अनमॉडिफाइड चलाते हैं।

पूर्ण संदर्भ के लिए, देखें: https://www.gnu.org/savannah-checkouts/gnu/grep/manual/grep.html


सरल महान जवाब।
ब्रेडमज

सहमत- जब आप वैरिएबल का उपयोग कर रहे हैं, तो आप कुछ ऐसा नहीं कर सकते जैसे PHP के addslashes()bash में है। यह इसे करने का सबसे सरल तरीका है।
जेरलिंगगुगी

1
धन्यवाद, यह काम किया। अनुस्मारक: यदि दोहरे उद्धरण चिह्नों का उपयोग करना है, तो आपको अभी भी बचना होगा$ , जैसे:, grep -FR "unset(\$foo['bar'])"अन्यथा यह सोचता है कि यह एक बाहरी चर है और इसे विस्तारित करने की कोशिश करता है
aexl

57

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


1
गंभीरता से, यह स्वीकृत उत्तर होना चाहिए था!
अंकुश

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

8

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

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

3

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

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

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

तो एक मान्य उत्तर होगा:

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

2

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

उदाहरण:

grep -HnrF -- <pattern> <files>

उम्मीद है कि किसी की मदद करेंगे।


क्या एफ के लिए खड़ा है?
अर्नोल्ड रोआ

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

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

@ डैनियल यह इस बात पर निर्भर करता है कि आप क्या करना चाहते हैं: -Fपैटर्न को एक नियमित अभिव्यक्ति के रूप में --व्याख्या करने से बचा जाता है , जबकि इसे grep के विकल्प के रूप में निम्नलिखित तत्वों की व्याख्या करने से बचा जाता है।
आलोक गो गो

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