2010-07-12 12 views
7

मैं में और एक निर्देशिका के अंतर्गत लगभग 40 जावास्क्रिप्ट फ़ाइलों के लिए विश्व स्तर पर एक निश्चित नियमित अभिव्यक्ति प्रतिस्थापन लागू करना चाहते हैं के साथ कई फाइलों को विश्व स्तर पर नियमित अभिव्यक्ति प्रतिस्थापन लागू करें। मैं एक विम उपयोगकर्ता हूं, लेकिन हाथ से ऐसा करना कठिन और त्रुटि-प्रवण हो सकता है, इसलिए मैं इसे एक स्क्रिप्ट के साथ स्वचालित करना चाहता हूं।एक स्क्रिप्ट

मैं एसईडी कोशिश की, लेकिन एक समय में एक से अधिक पंक्ति से निपटने खासकर अगर वहाँ कितने लाइनों पैटर्न से मेल करने वाले के लिए कोई सीमा नहीं है अजीब है।

मैं भी (एक एकल फाइल पर, परीक्षण के लिए) इस स्क्रिप्ट की कोशिश की:

ex $1 <<EOF 
gs/,\(\_\s*[\]})]\)/\1/ 
EOF 

पैटर्न किसी भी पर्ल/रूबी शैली सूची में एक अनुगामी अल्पविराम समाप्त करेंगे, ताकि "[क, ख, सी,] इंटरनेट एक्सप्लोरर को संतुष्ट करने के लिए "[ए, बी, सी]" के रूप में बाहर आ जाएगा, जो ब्राउज़र के बीच अकेले, ऐसी सूचियों पर चोक करता है।

पैटर्न vim में खूबसूरती से काम करता है लेकिन ऊपर स्क्रिप्ट के अनुसार अगर मैं पूर्व में इसे चलाने के लिए कुछ भी नहीं है,।

किसी को भी देख सकते हैं कि मैं क्या याद आ रही हो सकता है?

+0

मैं बहुत अच्छी तरह से vim पता नहीं है, लेकिन आप नोटपैड के साथ ++ आसानी से यह कर सकते हैं, स्क्रिप्ट के बिना ... या यदि आप वास्तव में vim के साथ क्या करना चाहते हैं, इस पर एक नजर है। http://www.ibrahim-ahmed.com/2008/01/find-and-replace-in-multiple-files-in.html – BrunoLM

उत्तर

12

आप एक स्क्रिप्ट के लिए कहा है, लेकिन आप का उल्लेख किया है कि आप vim उपयोगकर्ता हैं।मैं तो जैसे परियोजना चौड़ा मिल रहा है और vim के अंदर बदलने के लिए, करते हैं:

:args **/*.js | argdo %s/,\(\_\s*[\]})]\)/\1/ge | update 

यह बहुत :bufdo समाधान एक और टिप्पणीकार ने उल्लेख के समान है, लेकिन यह आपके buflist की अपेक्षा अपनी आर्ग सूची का उपयोग करेगा (और इस प्रकार एक ब्रांड नए विम सत्र की आवश्यकता नहीं होती है और न ही आप उन बफर को बंद करने के बारे में सावधान रहना चाहते हैं जिन्हें आप छुआ नहीं चाहते हैं)।

  • :args **/*.js - अपने arglist सेट इस निर्देशिका में सभी .js फाइलों और उपनिर्देशिकाओं
  • को रोकने के लिए
  • | - पाइप, vim के आदेश विभाजक है हमें एक पंक्ति
  • :argdo पर कई आदेशों है - निम्न आदेश चला (एस) सभी तर्कों पर। यह "निगल" होगा बाद में पाइप
    • % - एक सीमा पूरी फ़ाइल
    • :s का प्रतिनिधित्व - स्थानापन्न आदेश है, जो आप पहले से ही
    • के बारे में
    • :s_flags, ge पता है - वैश्विक (विकल्प के रूप में कई प्रति पंक्ति संभव के रूप में कई बार) और त्रुटियों को दबाने (यानी "नहीं मैच")
    • | - इस पाइप :argdo द्वारा "निगल" है, इसलिए निम्न आदेश भी प्रति तर्क एक बार संचालित
    • :update - :write की तरह है, लेकिन केवल जब बफर संशोधित किया गया है

यह पैटर्न स्पष्ट रूप से किसी भी vim आदेश जो आप एक से अधिक फ़ाइलों पर चलाना चाहते हैं के लिए काम करेंगे, तो यह एक आसान एक को ध्यान में रखना है। उदाहरण के लिए, मैं इसे उपयोग करने के लिए खाली स्थान के (%s/\s\+$//) अनुगामी दूर करने के लिए, वर्दी लाइन अंत (set ff=unix) या फ़ाइल इनकोडिंग (set filencoding=utf8), और retab मेरी फ़ाइलें सेट की तरह।

+0

यह बढ़िया है! लेकिन क्या 334 फाइलों पर चोक होगा? –

+1

मैंने इसे 1000+ फाइलों के साथ किया है और कोई समस्या नहीं है। यह फ़ाइलों को एक साथ खोलने की कोशिश नहीं करता है और स्क्रिप्ट को समानांतर या किसी भी तरह की फैंसी में चलाता है, इसलिए बर्गर निष्क्रिय होते हैं (फ़ाइल को स्मृति से अनलोड किया जाता है) जब उनके साथ Argdo किया जाता है (जब तक कि आपके पास दूसरी विंडो में बफर खुलता नहीं है)। इसमें कई फ़ाइलों को प्राप्त करने में कुछ समय लग सकता है। ;) –

+2

हाँ, मैंने कल इसे आजमाया और यह एक चैंप की तरह काम किया। क्या मणि है! धन्यवाद! । ': –

0

आप खिड़कियों पर कर रहे हैं, नोटपैड ++ पर सभी खोला फ़ाइलें आप सरल regexes चलाने के लिए अनुमति देता है। ,\s*\] के लिए

खोजें और ]

के साथ बदलें सूचियों आप का वर्णन के प्रकार के लिए काम करना चाहिए।

5

1) vim साथ सभी फाइलों को खोलें:

bash$ vim $(find . -name '*.js') 

2) सभी फाइलों को स्थानापन्न आदेश लागू करें:

:bufdo %s/,\(\_\s*[\]})]\)/\1/ge 

3) सभी फाइलों को सेव करें और छोड़ दिया:

:wall 
:q 

मुझे लगता है कि आप इसे सही नहीं लगता है, तो आपकी खोज पैटर्न पुनः जाँच की आवश्यकता होगी। मुझे लगता है कि आपके पास \_\s* है, इसके बजाय आपके पास \_s* होना चाहिए।

संपादित करें: तुम भी :s... आदेश के लिए /ge विकल्पों का उपयोग करना चाहिए (मैं इन ऊपर जोड़ दिया है)।

+0

'\ s *' शून्य या अधिक खाली स्थान के से मेल खाता है। –

+0

'\ s *' केवल रिक्त स्थान और टैब से मेल खाता है, मेरा मानना ​​है कि इस प्रतिस्थापन के लिए '\\ _ रों *' जो भी पंक्ति विराम से मेल खाता है कहता है। –

0

आप खोज आदेश के संयोजन का उपयोग और sed

find /path -type f -iname "*.js" -exec sed -i.bak 's/,[ \t]*]/]/' "{}" +; 
+0

यह काफी शायद '' और समापन कोष्ठक के बीच नई पंक्तियां नहीं होगा है। –

3

कर सकते हैं आप कमांड लाइन है, जो उन्हें सक्षम बनाता है से तर्क +'command' पास करके दोनों vi और ex की कार्रवाई को स्वचालित कर सकते पाठ के रूप में प्रयोग की जाने वाली फिल्टर।

अपनी स्थिति में, निम्न आदेश ठीक से काम करना चाहिए:

find /path/to/dir -name '*.js' | xargs ex +'%s/,\(\_\s*[\]})]\)/\1/g' +'wq!'

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