2011-02-16 17 views
5

मेरे पास एक कोड बेस है जो पीछे की सफेद जगह के कारण संघर्ष के साथ मुझे पागल कर रहा है। मैं इसे साफ करना चाहता हूं।कोडबेस, पिछली सफेद जगहों, नई लाइनों आदि को कैसे साफ़ करें

मैं चाहता था करने के लिए:

  • निकालें सभी पिछली श्वेत रिक्ति
  • फ़ाइलों
  • Convert यूनिक्स (dos2unix) के लिए सभी लाइन अंत
  • Convert सब के अंत में किसी भी नई पंक्ति वर्ण निकाल दें टैब पर अग्रणी रिक्त स्थान, यानी टैब के लिए 4 रिक्त स्थान।

  • .git निर्देशिका को अनदेखा करते समय।

मैं तेंदुए पर OSX हिम हूँ, और zsh में।

अब तक, मेरे पास है:

sed -i "" 's/[ \t]*$//' **/*(.) 

जो अच्छा काम करता है, लेकिन sed जो अच्छा नहीं है हर फ़ाइल को स्पर्श करने, के अंत में एक नई लाइन कहते हैं। मुझे नहीं लगता कि sed को ऐसा करने से रोका जा सकता है, तो मैं इन नई लाइनों को कैसे हटा सकता हूं? यहां शायद कुछ अजीब जादू लागू किया जा सकता है।

(पूरा जवाब भी स्वागत)

उत्तर

5

[संपादित करें: फिक्स्ड खाली स्थान के ट्रिमिंग]
[संपादित करें # 2: पट्टी फ़ाइल के अंत से रिक्त लाइनों अनुगामी]

perl -i.bak -pe 'if (defined $x && /\S/) { print $x; $x = ""; } $x .= "\n" x chomp; s/\s*?$//; 1 while s/^(\t*) /$1\t/; if (eof) { print "\n"; $x = ""; }' **/*(.) 

यह स्ट्रिप्स फ़ाइल से पिछली रेखाओं को पीछे छोड़कर, लेकिन फ़ाइल के अंत में बिल्कुल एक \n छोड़ देता है। अधिकांश टूल इसकी अपेक्षा करते हैं, और यह अधिकांश संपादकों में रिक्त रेखा के रूप में दिखाई नहीं देगा। हालांकि यदि आप उस अंतिम \n को पट्टी करना चाहते हैं, तो बस आदेश से print "\n"; भाग हटाएं।

आदेश "सहेजने" द्वारा काम करता है \n वर्ण जब तक कि एक गैर-खाली वर्ण वाली रेखा दिखाई न दे - तब यह उस पंक्ति को संसाधित करने से पहले सभी को प्रिंट करता है।

\s*? मैचों शून्य या अधिक खाली स्थान के पात्रों गैर लालच से, \r, जो \r\n डॉस लाइन का पहला वर्ण है सहित निकालें .bak मूल फाइल का बैकअप बनाने से बचने के लिए (अपने जोखिम पर उपयोग!) सिंकैक्स-स्क्रैप करें। पर्ल में, $ या तो लाइन के अंत में या अंतिम \n से पहले मेल खाता है, इसलिए इस तथ्य के साथ संयुक्त *? गैर-लालची से मेल खाता है (पहले 0-चौड़ाई मैच का प्रयास कर रहा है, फिर 1-चौड़ाई वाला मैच और इसी तरह) यह सही बात करता है।

1 while s/^(\t*) /$1\t/ केवल एक लूप है जो किसी भी संख्या के टैब से शुरू होने वाली किसी भी पंक्ति को बार-बार बदल देता है, इसके बाद 4 रिक्त स्थान के साथ एक और टैब के साथ होता है, जब तक यह अब संभव नहीं होता है।तो यह सब \t पात्रों एक स्तंभ द्वारा 4.

विभाज्य मैंने पहले **/*(.) वाक्य रचना नहीं देखा है पर शुरू बशर्ते भले ही कुछ लाइनों आंशिक रूप से पहले से ही टैब के लिए बदल दिया गया है काम करेंगे, संभवतः है कि एक zsh विस्तार है? अगर यह sed के साथ काम करता है, तो यह perl के साथ काम करेगा।

+0

**/* (।) एक zsh ग्लोब है। यह कई फाइलों पर कार्रवाई करने का एक और तरीका है। ताकि प्रत्येक फ़ाइल के लिए एक बार पर्ल स्टेटमेंट निष्पादित किया जाएगा। – jhogendorn

+1

इसके अलावा, यह काम नहीं करता है? यह सभी सफेद जगहों, नई लाइनों, सब कुछ हटा देता है। – jhogendorn

+0

अरे! इसे अभी फिक्स्ड किया और इसका परीक्षण किया। –