2010-07-18 6 views
7

मेरे पास कुछ स्रोत कोड फ़ाइल है जिसमें मिश्रित टैब/रिक्त स्थान हैं और मैं इसे एक फ़ाइल में रूपांतरित करना चाहता हूं जहां उसने स्वचालित रूप से सभी इंडेंटेशन रिक्त स्थान को टैब द्वारा प्रतिस्थापित कर दिया है एक दिया गया टैब स्पेस लम्बाई (यानी उदाहरण टैब = 2 रिक्त स्थान के लिए)।मिश्रित रिक्त स्थान/टैब के साथ txt फ़ाइल को केवल टैब पर कनवर्ट करें (जहां संभव हो)

कोई आसान समाधान (सामान्य यूनिक्स उपकरण, मैकोज़क्स, बैश या zsh के साथ)? कुछ sed स्क्रिप्ट या पायथन कमांड या तो?

धन्यवाद, अल्बर्ट

+0

क्या मैं पूछ सकता हूं कि यहां किसने वोट दिया है? और क्यों? और टिप्पणी के बिना क्यों? – Albert

+0

करीबी वोट के लिए खेद है, पहले मैंने सोचा कि यह superuser.com पर होगा लेकिन फिर मैंने देखा कि यह प्रोग्रामिंग के बिना नहीं किया जा सकता है। – Philipp

उत्तर

5

ठीक है, यह देखते हुए समाधान में से कोई भी मुझे संतुष्ट है, इसलिए मैं यह कोडित अपने आप:

0

आप एक टैब charater द्वारा रिक्त स्थान एन को बदलने के लिए रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं। अजगर में उदाहरण के लिए: - स्थान लंबाई से टैब प्रतिस्थापन गुणा करने के लिए नियमित अभिव्यक्ति नहीं कर सकता sed -i XXX.txt 's/^[ ]\{2\}/\t/g'

  • import re 
    re.sub('[ ]{4}', '\t', text) 
    
  • +0

    यह इतना आसान नहीं है। उदाहरण के लिए यह न केवल इंडेंटेशन के लिए उपयोग की जाने वाली रिक्त स्थान को प्रतिस्थापित करेगा बल्कि हर जगह भी (और इसे ऐसा नहीं करना चाहिए)। – Albert

    0

    दो बातें,

    1. sed -i अपने दोस्त है।

    को देखते हुए मेरी AWK फू मजबूत नहीं है (और मैं अगर यह क्या # 2 नहीं कर सकते हैं कर सकते हैं पता नहीं है), मैं रिक्त स्थान की गणना करने और उन्हें टैब के साथ बदलने के लिए एक PHP स्क्रिप्ट लिखेंगे।

    +0

    ठीक है, कम से कम केवल शुरुआत में रिक्त स्थान को प्रतिस्थापित करेगा। हालांकि यह इसे कई बार प्रतिस्थापित नहीं करेगा। मैं शायद एक पायथन लिपि लिखूंगा जो मेरे लिए यह करता है। – Albert

    0
    sed -r 's/ {2}/\t/g' file 
    
    +0

    यह इतना आसान नहीं है। उदाहरण के लिए यह न केवल इंडेंटेशन के लिए उपयोग की जाने वाली रिक्त स्थान को प्रतिस्थापित करेगा बल्कि हर जगह भी (और इसे ऐसा नहीं करना चाहिए)। – Albert

    1

    स्रोत भाषा के आधार पर, आप GNU indent को आजमा सकते हैं। यह स्रोत कोड के इंडेंटेशन से संबंधित बड़ी संख्या में चीजें कर सकता है, हालांकि यह आपकी आवश्यकता से अधिक जटिल हो सकता है।

    उदाहरण के लिए

    , अगर मैं indent -di0 <inputfile>

    #include <stdio.h> 
    
    int main(int argc, char **argv) 
    { 
        int i; 
        int j; 
        for (i = 0; i < 10; i++) 
        { 
         for (j = 0; j < 10; j++) 
        { 
         printf("x"); 
        } 
        } 
    } 
    

    के लिए निम्न कार्यक्रम देने के यह से प्रतिस्थापित कर देगा: अगर आप की जरूरत है कुछ बेवकूफ सरल, वहाँ है expand/unexpand आदेश,

    #include <stdio.h> 
    
    int 
    main(int argc, char **argv) 
    { 
        int i; 
        int j; 
        for (i = 0; i < 10; i++) { 
         for (j = 0; j < 10; j++) { 
          printf("x"); 
         } 
        } 
    } 
    

    या।

    import re 
    import fileinput 
    
    pat = re.compile("^()+") 
    
    for line in fileinput.input(inplace=True): 
        print pat.sub(lambda m: "\t" * (m.end() // 2), line, 1), 
    
    +0

    'इंडेंट' काम नहीं करता है (यह पायथन है - कठिन मैं एक समाधान की तलाश भी कर रहा हूं जो अन्य मामलों में भी काम करता है)। 'विस्तार'/'unexpand' बहुत सरल है (मूल रूप से यहां दिए गए अधिकांश अन्य समाधानों की तरह)। :) – Albert

    +0

    शायद http://svn.python.org/projects/python/trunk/Tools/scripts/reindent.py पर reindent.py स्क्रिप्ट आपके लिए आवश्यकतानुसार आधार देगा? – mjschultz

    +1

    अरे, कि reindent.py अधिकतर मैं चाहता था की तरह दिखता है। :) ठीक है, इसमें बहुत कुछ नहीं देखा, यह सुनिश्चित नहीं है कि यह केवल पायथन ही है (जिसने मुझे अभी मदद की होगी लेकिन सामान्य समाधान नहीं होता जो मैं खोज रहा था)। इसे अब कोड किया गया ... – Albert

    0

    यहाँ पायथन में एक संभव समाधान है। :)

    यहाँ देखें:

    +0

    ठीक है, दूसरों की तुलना में बेहतर समाधान है, लेकिन अगर मिश्रित रिक्त स्थान/टैब पहले से ही काम नहीं करते हैं तो यह काम नहीं करेगा। Sth। जैसे \ "\ t \ t" '' \ t "* 3' बनना चाहिए। – Albert

    +0

    क्या यह काम करता है यदि आप regex को '"^(| \ t) + "' के साथ प्रतिस्थापित करते हैं? मुझे लगता है कि मैं आवश्यकताओं को बिल्कुल समझ नहीं पा रहा हूं। __EDIT: __ जो कि नए रेगेक्स में * दो * रिक्त स्थान है, इनलाइन कोड मार्कअप दुर्भाग्य से रिक्त स्थान को ध्वस्त करता है। – Philipp

    0

    इस टैब में अग्रणी रिक्त स्थान (यहां तक ​​कि टैब के साथ बीच-बीच में) में परिवर्तित कर देंगे। चर सेट करके कन्वर्ट करने के लिए रिक्त स्थान की संख्या निर्दिष्ट करें। भयानक रिक्त स्थान कुछ भी नहीं गिर जाएगा। स्पेस या टैब के अलावा किसी भी चरित्र के बाद दिखाई देने वाली रिक्त स्थान और टैब स्पर्श नहीं किए जाएंगे।

    tstop=2 
    sed "s/^\([[:blank:]]*\)\(.*\)/\1\n\2/;h;s/[^[\n]*//;x;s/\n.*//;s/ \{$tstop\}/X/g;s/ //g;G;s/\n//g" inputfile 
    

    उदाहरण:

    [space][space][tab][tab][space][space][space][tab][space]TEXT[space][space][space] 
    

    [tab][tab][tab][tab][tab]TEXT[space][space][space] 
    

    में परिवर्तित हो जाएगा अगर वह नहीं है आप के लिए, समायोजन किया जा सकता है वास्तव में क्या देख रहे हैं।

    +0

    पूरी तरह से अपठनीय लेकिन ऐसा लगता है कि मैं क्या खोज रहा था। :) बीटीडब्ल्यू, यह आउटपुट में '... [टैब] [अंतरिक्ष] पाठ नहीं होना चाहिए? कम से कम यही वही है जो मैं चाहता हूं। – Albert

    +0

    मैं सभी भटकने वाली जगहों को हटा रहा हूं। आप क्या चाहते हैं ('tstop = 2' के लिए)' [टैब] [स्पेस] [टैब] ... टेक्स्ट 'जैसा दिखने के लिए? '[टैब] [स्पेस] [स्पेस] टेक्स्ट 'के बारे में क्या? –

    +0

    '[टी] [एस] [टी] पाठ '' [टी] [टी] पाठ' बनना चाहिए। '[टी] [एस] पाठ '' [टी] [टी] पाठ' बनना चाहिए। '[टी] [एस] पाठ 'वही रहना चाहिए। – Albert

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