2011-03-16 9 views
7

मुझे egrep एक स्ट्रिंग है जो रनटाइम से पहले ज्ञात नहीं है और मुझे खोल चर के माध्यम से मिल जाएगा (शैल बाश है, अगर यह मायने रखता है)। समस्या यह है कि उस स्ट्रिंग में विशेष वर्ण होंगे जैसे ब्रेसिज़, स्पेस, डॉट्स, स्लेश, और इसी तरह।नियमित अभिव्यक्ति में पहले अज्ञात स्ट्रिंग से कैसे बचें?

यदि मुझे स्ट्रिंग पता है तो मैं एक समय में विशेष पात्रों से बच सकता हूं, लेकिन मैं पूरी स्ट्रिंग के लिए ऐसा कैसे कर सकता हूं?

प्रत्येक विशेष चरित्र को उपसर्ग करने के लिए एक स्क्रिप्ट स्क्रिप्ट के माध्यम से स्ट्रिंग को चलाने के साथ \ n एक विचार हो सकता है, मुझे अभी भी इस तरह की एक स्क्रिप्ट लिखी जानी चाहिए। मुझे नहीं पता कि क्या अन्य, बेहतर, विकल्प हैं।

मैं re_format(7) पढ़ा है लेकिन ऐसा लगता है जैसे "शाब्दिक रूप में पूरे अगले स्ट्रिंग ले" ऐसी कोई बात नहीं है ...

संपादित करें: झूठे सकारात्मक से बचने के लिए, मैं भी पैटर्न के लिए न्यू लाइन का पता लगाने जोड़ना चाहिए, जैसे। egrep '^myunknownstring'

+0

बैश में नियमित अभिव्यक्तियों से कैसे बचें http://stackoverflow.com/questions/11856054/bash-easy-way-to-pass-a-raw-string-to-grep/16951928#16951928 –

उत्तर

7

बनाने के लिए आप एक बड़ा अभिव्यक्ति में स्ट्रिंग एम्बेड करने के लिए की जरूरत है, sed मैं इसे कैसे करना होगा है।

s_esc="$(echo "$s" | sed 's/[^-A-Za-z0-9_]/\\&/g')" # backslash special characters 
inv_ent="$(egrep "^item [0-9]+ desc $s_esc loc .+$" inventory_list)" 
+0

'sed' s/[^ [: alnum:] _-]/\\ & g'' को आजमाएं क्योंकि आपका संस्करण सभी स्थानों पर काम नहीं करता है – SiegeX

+0

's_esc = $ (echo" $ s "| sed ' एस/[] \\। $ * {} | +?() [^ -]/\\ और/g ')' भी काम करना चाहिए। – skozin

4

-F ध्वज का उपयोग एक निश्चित शाब्दिक स्ट्रिंग पद्धति

$ var="(.*+[a-z]){3}" 
$ echo 'foo bar (.*+[a-z]){3} baz' | grep -F "$var" -o 
(.*+[a-z]){3} 
+0

टिप के लिए धन्यवाद , यह सही है, लेकिन मैं यह निर्दिष्ट करना भूल गया कि मुझे लाइन की शुरुआत में स्ट्रिंग _only_ से मिलान करने की भी आवश्यकता है। मैंने इस विवरण को प्रश्न में जोड़ा। – Luke404

0

आप से गलत तरीके से बैश वाक्य रचना के रूप में व्याख्या की जा रही स्ट्रिंग की रक्षा के लिए कोशिश कर रहे हैं या आप नियमित अभिव्यक्ति वाक्य रचना के रूप में व्याख्या की जा रही से स्ट्रिंग के कुछ हिस्सों को बचाने की कोशिश कर रहे हैं?

बैश सुरक्षा के लिए:

ग्रेप -f स्विच का समर्थन करता है:

-f FILE, --file=FILE 
    Obtain patterns from FILE, one per line. The empty file contains zero patterns, and therefore matches nothing. 

नहीं एस्केपिंग फाइल के अंदर आवश्यक है। बस इसे एक फ़ाइल (और इस प्रकार एक पैटर्न) वाली फ़ाइल बनाएं जिसे आपके खोल चर से बनाया जा सकता है यदि आपको ऐसा करने की ज़रूरत है।

# example trivial regex 
var='^r[^{]*$' 
pattern=/tmp/pattern.$$ 
rm -f "$pattern" 
echo "$var" > "$pattern" 
egrep -f "$pattern" /etc/password 
rm -f "$pattern" 

बस बिंदु को चित्रित करने के लिए।

इसके बजाय -F के साथ प्रयास करें क्योंकि एक अन्य पोस्टर रेगेक्स सुरक्षा के लिए सुझाया गया है।