मैं इंडेंटेशन साइज़ को कैसे बदल सकता हूँ


4

मेरे पास बड़ी संख्या में फाइलें हैं जो एक निश्चित तरीके से इंडेंट हैं और उन्हें इंडेंटेशन की एक अलग शैली में बदलना चाहते हैं (वे 4 स्थानों के साथ इंडेंट हैं और मैं चाहता हूं कि वे 2 स्पेस का उपयोग करें)। मैं फ़ाइलों के एक बड़े समूह के लिए इंडेंटेशन को स्वचालित रूप से कैसे समायोजित कर सकता हूं (अधिमानतः फ़ाइलों की एक सूची दी गई है, क्योंकि केवल एक निश्चित एक्सटेंशन वाले लोगों के पास यह टैब आकार है)।

मैं विंडोज का उपयोग कर रहा हूं, लेकिन लिनक्स मशीनों तक पहुंच है और साइगविन स्थापित है।

इसके लायक होने के लिए, मेरे पास बहुत साफ और सुसंगत इंडेंटेशन है। यह 2 के साथ 4 रिक्त स्थान की जगह के रूप में सरल नहीं है, हालांकि, चूंकि हम केवल प्रमुख स्थान को बदलना चाहते हैं।


'बड़ी संख्या' क्या है?
Jan Doggen

@JanDoggen, वास्तव में इतना बड़ा नहीं, शायद सौ। छोटे पर्याप्त किसी भी स्वचालित विधि को ठीक से काम करना चाहिए लेकिन मैन्युअल रूप से करने के लिए बहुत बड़ा।
कैट

इसलिए मैंने पूछा: सौ फाइलों के लिए (यह मान लेना एक बार-केवल एक ऑपरेशन है) कि आपका टेक्स्ट एडिटर काफी अच्छा हो सकता है, अगर उसमें कीबोर्ड मैक्रो (या रिपीट फंक्शन) हो और सभी + आउटलेस्ट का चयन कर सकें।
Jan Doggen

जवाबों:


4

निम्नलिखित एक-लाइनर:

perl -ne '$_ =~ s|^((    )+)|"  " x (length($1)/4)|eg; print $_' < test.txt

2-अंतरिक्ष इंडेंट के साथ 4-स्थान इंडेंट की जगह।

(आप उत्पन्न पैटर्न को देखने के " "साथ प्रतिस्थापित करके सत्यापित कर सकते "-+"हैं)

अब, हम एक bash फ़ाइल बना सकते हैं, इसे कॉल करते हैं indent-changer.sh:

#!/bin/bash
while read filename; do
    if ! [[ -r "$filename" ]]; then
        echo "Skipping '$filename' because not readable"
        continue
    fi
    tempfile="$(mktemp)"
    if perl -ne '$_ =~ s|^((    )+)|"  " x (length($1)/4)|eg; print $_' < "$filename" > "$tempfile"; then
        mv "$filename" "$filename".orig
        mv "$tempfile" "$filename"
        echo "Success processing '$filename'"
    else
        echo "Failure processing '$filename'"
    fi
done < "$1"

फ़ाइलों की सूची को फ़ाइल में संसाधित करने के लिए डंप करें, और उपरोक्त स्क्रिप्ट निष्पादित करें। मूल फ़ाइल अभी भी प्रत्यय के साथ मौजूद .origहै। इसलिए, उदाहरण के लिए:

find . -type f -iname "*.txt" > files-to-process.lst
# Verify or edit the .lst file as needed
./indent-changer.sh files-to-process.lst > processing.log

आप आसानी से कर सकते हैं egrep -v '^Success' processing.log


पुनश्च: मैंने अपने सिग्विन इंस्टॉलेशन पर वन-लाइनर (लेकिन बैश स्क्रिप्ट नहीं) का परीक्षण किया; मुझे याद नहीं है कि क्या perlमूल स्थापना का हिस्सा है, या बाद में जोड़ा गया है। लेकिन मुझे लगता है कि यह मूल स्थापना का हिस्सा है।

"-+"निम्न फ़ाइल के साथ पैटर्न का परीक्षण :

THis is a test file
    With indentation
        more indentation
        plus    internal spaces
    outdent
        indent again
        another    internal space example
          two spaces after two indents
        end
    end
end

का परिणाम:

THis is a test file
-+With indentation
-+-+more indentation
-+-+plus    internal spaces
-+outdent
-+-+indent again
-+-+another    internal space example
-+-+  two spaces after two indents
-+-+end
-+end
end

संपादित करें 2: यहां पर्ल वन-लाइनर का अधिक सामान्य संस्करण है:

perl -ne '$f="    ";$t="  ";$_=~s|^(($f)+)|$t x (length($1)/length($f))|eg; print $_' < test.txt

इस संस्करण के साथ, बस के लिए परिभाषाओं को संपादित $fऔर $tजरूरत के रूप में।


1
कला कर्म! धन्यवाद :)
micahblu

2

सबसे सरल तरीका मैं उपयोग करने के बारे में सोच सकता हूं unexpandऔर expandआपके द्वारा उपयोग किए जा रहे सिस्टम के आधार पर, निम्न कमांड (आर्क लिनक्स में काम करता है) काम कर सकता है या नहीं कर सकता है (ओएस एक्स और आर्क लिनक्स में इस कमांड में अलग-अलग तर्क सेट हैं। अपना खुद का संदर्भ लें। man unexpandऔर man expandविस्तृत उपयोग के लिए।),

unexpand  -t 4 --first-only [your_file] > [temp]
expand -i -t 2 [temp] > [output]

पहला कमांड जो सभी प्रमुख 4-स्पेस इंडेंटेशन [your_file]को टैब में बदल देता है, परिणाम के रूप में सहेजा जाता है [temp]। दूसरा कमांड सभी प्रमुख टैब [temp]को 2-स्पेस ग्रुप में बदल देता है, आउटपुट है [output]

बेशक आप इसे छोटे रूप में भी पाइप कर सकते हैं

unexpand --first-only -t 4 [your_file] | expand -i -t 2 > [output]

बड़ी संख्या में फ़ाइलों के लिए इंडेंटेशन बदलने के लिए, आप एक छोटी स्क्रिप्ट फ़ाइल लिख सकते हैं, example.sh

FILES=/path/to/*.[your_suffix]
OLD_LENGTH=4        # old indentation length
NEW_LENGTH=2        # new indentation length
for f in $FILES; do
  unexpand --first-only -t $OLD_LENGTH f | expand -i -t $NEW_LENGTH > f
done

आह्वान करके

sh ./example.sh

आप के पैटर्न को संतुष्ट करने वाली सभी फाइलों के इंडेंटेशन को बदल देंगे /path/to/*.[your_suffix]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.