2008-10-01 10 views
20

मैं एक खोज करने और फ़ाइल पर प्रतिस्थापित करने के लिए क्या जीएनयू/लिनक्स कमांड लाइन उपकरण का उपयोग करूंगा?मैं एक खोज करने और फ़ाइल पर प्रतिस्थापित करने के लिए क्या जीएनयू/लिनक्स कमांड लाइन उपकरण का उपयोग करूंगा?

क्या खोज टेक्स्ट, और प्रतिस्थापन, रेगेक्स प्रारूप में निर्दिष्ट किया जा सकता है? उन एकल उद्धरण में

perl -pi -e 's/foo/bar/g;' *.txt 

किसी भी सामान्य रों /// पैटर्न:

उत्तर

46
sed 's/a.*b/xyz/g;' old_file > new_file 

GNU sed (जो आप शायद है) और भी अधिक बहुमुखी है:

sed -r --in-place 's/a(.*)b/x\1y/g;' your_file 

इन सभी विकल्पों का एक संक्षिप्त विवरण है:

मैं [SUFFIX], - इन-प्लेस [= SUFFIX] जगहों पर फ़ाइलों को संपादित करें (विस्तारित होने पर बैकअप बनाता है)

-r, --regexp- विस्तारित स्क्रिप्ट में विस्तारित नियमित अभिव्यक्तियों का उपयोग करें।

FreeBSD संस्करण इन विकल्पों का भी समर्थन करता है। NetBSD और OpenBSD संस्करण केवल -r का समर्थन करते हैं।

यदि आप sed के बारे में और जानना चाहते हैं, Cori ने this tutorial का सुझाव दिया है।

+0

मुझे विस्तारित regex - आसान की अनुमति देने के लिए -r स्विच के बारे में पता नहीं था! इसके अलावा, -i -in-place के लिए शॉर्टकट है। –

+0

और यदि आप और जानना चाहते हैं तो ऊपर कोरी के लिंक का उपयोग करें। sedl afaik – MattSmith

+0

की तुलना में अधिक हल्का वजन है एक महान स्टार्टर .. और ट्यूटोरियल लिंक के लिए धन्यवाद! उपयोगी उदाहरण के लिए – Swanand

26

पर्ल इस के लिए आविष्कार किया गया था। आप कुछ इस तरह के साथ एक बैकअप रख सकते हैं:

perl -pi.bak -e 's/foo/bar/g;' *.txt 

या पाइपलाइन:

cat file.txt | perl -ne 's/foo/bar/g;' | less 

लेकिन वह वास्तव में अधिक sed का काम है।

5

sed, स्ट्रीम संपादक, और हाँ, यह regex का उपयोग करता है।

6

रूबी के विकल्प के रूप में रूबी पर विचार करें। इसने पर्ल के एक-लाइनर कमांडलाइन तर्कों को चुरा लिया (-i, -p, -l, -e, -n) और पर्ल की तरह आपके लिए स्वत: सेट $_ और बहुत सारे रेगेक्स भलाई है। इसके अतिरिक्त रूबी का वाक्यविन्यास पर्ल या sed की तुलना में पढ़ने या लिखने के लिए अधिक आरामदायक और आसान हो सकता है। (या नहीं, अपने स्वाद पर निर्भर करता है।)

ruby -pi.bak -e '$_.gsub!(/foo|bar/){|x| x.upcase}' *.txt

बनाम

perl -pi.bak -e 's/(foo|bar)/\U\1/g' *.txt

कई मामलों जब एक-लाइनर्स के साथ काम में, प्रदर्शन एक मुद्दे के लिए पर्याप्त देखभाल करने के लिए नहीं है चाहे आप लाइटवेट सेड या हेवीवेट पर्ल या हेवीयर-वेट रूबी का उपयोग करें। जो कुछ भी लिखना आसान है उसका प्रयोग करें।

+1

धन्यवाद! मुझे लगता है कि इसे सरल (थोड़ा) द्वारा सरल किया जा सकता है: 'ruby -pi.bak -e' gsub (/ foo | bar /) {| x | x.upcase} '* .txt' (उदाहरण के लिए, '$ _' को हटा रहा है)। –