2009-02-09 18 views
33

ऐसा करने का सबसे अच्छा तरीका क्या है? मैं कोई कमांड लाइन योद्धा नहीं हूं, लेकिन मैं सोच रहा था कि संभवतः grep और cat का उपयोग कर एक तरीका है।कई फ़ाइलों में खोजने/प्रतिस्थापित करने का सबसे अच्छा तरीका?

मैं सिर्फ एक फ़ोल्डर और उप-फ़ोल्डर में होने वाली स्ट्रिंग को प्रतिस्थापित करना चाहता हूं। ऐसा करने का सबसे अच्छा तरीका क्या है? अगर यह मायने रखता है तो मैं उबंटू चला रहा हूं।

-d

+0

बस इस लिंक को यहां छोड़ने के लिए जा रहे हैं: http://stackoverflow.com/questions/102083/whats-the-best-tool-to-find-and-replace-regular-expressions-over-multiple-files –

उत्तर

36
find . -type f -print0 | xargs -0 -n 1 sed -i -e 's/from/to/g' 

कि के पहले भाग फ़ाइलें आप बदलना चाहते हैं खोजने के लिए एक खोज कमान है। आपको उचित रूप से संशोधित करने की आवश्यकता हो सकती है। "Xargs" कमांड प्रत्येक फ़ाइल को ढूंढने में मिलता है और इसे "sed" कमांड लागू करता है। "Sed" कमांड "से" के हर उदाहरण को लेता है और इसे "से" के साथ बदल देता है। यह एक मानक नियमित अभिव्यक्ति है, इसलिए आपको इसकी आवश्यकता के अनुसार संशोधित करें।

यदि आप svn सावधान रह रहे हैं। आपकी .svn-निर्देशिका खोज और प्रतिस्थापित भी की जाएगी। आप उन, उदाहरण के लिए, इस तरह निकालने की ज़रूरत:

find . ! -regex ".*[/]\.svn[/]?.*" -type f -print0 | xargs -0 -n 1 sed -i -e 's/from/to/g'

या

find . -name .svn -prune -o -type f -print0 | xargs -0 -n 1 sed -i -e 's/from/to/g'

+0

ऐसा लगता है कि यह आदेश उपनिर्देशिका में पुनरावर्ती नहीं है। क्या मैं कुछ गलत कर रहा हूं? – blackrobot

+0

आपको क्या लगता है कि यह निर्देशिकाओं में रिकर्स नहीं कर रहा है? –

+0

उपनिर्देशिका में पाठ फ़ाइलें परिवर्तन नहीं कर रही हैं। मैं इसे क्या करना चाहता हूं यह है: कुछ subdirs में some.ip.address som someebsite.com की घटनाओं को बदलें। – blackrobot

37

के रूप में पॉल ने कहा, तो पहले आपको फ़ाइलें आप संपादित करना और फिर उन्हें संपादित करना चाहते हैं करना चाहते हैं। खोज का उपयोग कर के लिए एक वैकल्पिक जीएनयू ग्रेप (Ubuntu पर डिफ़ॉल्ट), उदाहरण के लिए उपयोग करने के लिए है:

grep -r -l from . | xargs -0 -n 1 sed -i -e 's/from/to/g' 

तुम भी पावती-ग्रेप उपयोग कर सकते हैं (sudo apt-get पावती-ग्रेप स्थापित करने या जाएँ http://petdance.com/ack/) के रूप में अच्छी तरह से, अगर आप जानते हैं कि आप केवल एक निश्चित प्रकार की फ़ाइल चाहते हैं, और संस्करण नियंत्रण निर्देशिकाओं में चीजों को अनदेखा करना चाहते हैं। जैसे, अगर आप केवल पाठ फ़ाइलों चाहते हैं,

ack -l --print0 --text from | xargs -0 -n 1 sed -i -e 's/from/to/g' 
# `from` here is an arbitrary commonly occurring keyword 

sed उपयोग करने का विकल्प पर्ल जो आदेश प्रति एक से अधिक फ़ाइलों को संसाधित कर सकते, जैसे उपयोग करने के लिए,

grep -r -l from . | xargs perl -pi.bak -e 's/from/to/g' 

यहाँ, पर्ल में संपादित करने के लिए कहा है है जगह, पहले एक .bak फ़ाइल बनाते हैं।

आप अपनी वरीयता के आधार पर, पाइप के बाएं हाथ के किनारों को दाएं हाथ के किनारों से जोड़ सकते हैं।

+0

आप "prune "कमांड का उपयोग करके" ढूंढें "में संस्करण नियंत्रण निर्देशिका से बच सकते हैं। उदाहरण के लिए "ढूंढें। -नाम आरसीएस -प्रून -o -type f -print0" –

+0

सच है, हालांकि इसे आपके लिए हैंडल जैसे उपकरण रखने के लिए कम दिमाग की आवश्यकता होती है। –

+0

एक फ़ाइल नामों के बीच एक डिलीमीटर के रूप में शून्य का उपयोग करने के लिए '--print0' विकल्प भी स्वीकार करता है, इसलिए आपका एएसी कमांड इस तरह दिखेगा: 'ack -l --print0 --text से | xargs -0 -n 1 sed -i -e/से/to/g'' –

3

sed के लिए एक वैकल्पिक rpl (http://rpl.sourceforge.net/ या अपने जीएनयू/लिनक्स वितरण से उपलब्ध जैसे) का उपयोग किया जाता है, rpl --recursive --verbose --whole-words 'F' 'A' grades/ तरह

14

मैं/Ag, The Silver Searcher का उपयोग कर ऐसा करने के लिए लगता है लोगों के लिए एक और उदाहरण में फेंक देंगे एकाधिक फ़ाइलों पर कार्रवाई की जगह ।

पूरा उदाहरण:

ag -l "search string" | xargs sed -i '' -e 's/from/to/g' 

अगर हम इस टूट, हम क्या मिलता है:

# returns a list of files containing matching string 
ag -l "search string" 

इसके बाद, हमने:

# consume the list of piped files and prepare to run foregoing command 
# for each file delimited by newline 
xargs 

अंत में, स्ट्रिंग प्रतिस्थापन आदेश :

# -i '' means edit files in place and the '' means do not create a backup 
# -e 's/from/to/g' specifies the command to run, in this case, 
# global, search and replace 

sed -i '' -e 's/from/to/g' 
संबंधित मुद्दे