एक ही आदेश के साथ कई पाठ फ़ाइलों को कैसे संपादित करें?


18

मैं कई पाठ फ़ाइलों की पहली पंक्ति को निकालना चाहता हूं और इसे दूसरी पंक्ति से बदलना चाहता हूं। क्या टर्मिनल का उपयोग करने का एक तरीका है?

मुझे पता है कि विम का उपयोग कैसे करना है, क्या इसके साथ इसे स्वचालित करने का कोई तरीका है? मैं इसे मैन्युअल रूप से करने से बचना चाहता हूं (जैसा कि प्रत्येक फ़ाइल को व्यक्तिगत रूप से संपादित करने में)।

यदि संभव हो तो मैं नए पुस्तकालयों को स्थापित करने से बचना चाहूंगा (विशेष रूप से उस चीज के लिए जिसे मैं बहुत सरल मानता हूं - लेकिन मैं गलत हो सकता हूं)।

अग्रिम में धन्यवाद!

जवाबों:


21

आप उपयोग कर सकते हैं sed:

sed -i.bak '1s/^.*$/new line/' *.txt

यह .txtवर्तमान निर्देशिका में सभी फ़ाइलों की पहली पंक्ति को पाठ के साथ new lineबदल देगा, इसे आपकी आवश्यकता को पूरा करने के लिए बदल देगा।

इसके अलावा, मूल फ़ाइलों को .bakविस्तार के साथ बैकअप दिया जाएगा , अगर आप नहीं चाहते कि बस उपयोग करें:

sed -i '1s/^.*$/new line/' *.txt

धन्यवाद! sedवास्तव में मैं क्या देख रहा था!
टॉमटैगस्क

@TomTsagk Glad i मदद कर सकता है :)
heemayl

11

खैर, vimखुद का उपयोग कर:

vim -Nesc 'bufdo call setline(1,"This is the replacement.") | wq' file1 file2 ...

यह क्या करता है:

  • setline (n, text), ठीक है, एक फ़ंक्शन है जो लाइन nको सेट करता है text
  • call कार्यों को कॉल करने के लिए आवश्यक है।
  • bufdo का उपयोग बफ़र्स पर एक कमांड दोहराने के लिए किया जाता है (एक सीमा के बिना, यह सभी बफ़र्स पर कार्य करता है)।
  • wqबफ़र को सहेजता और छोड़ता है। अगले बफ़र पर जाने से पहले हमें ऐसा करने की आवश्यकता है, इसलिए इस कमांड का callउपयोग करके कमांड को जंजीर दिया जाता है |
  • -c cmdरन cmdपहले बफर लोड करने के बाद एक कमांड-मोड कमांड है।
  • Nes गैर-संगत, मौन, पूर्व-मोड पर मुड़ता है, जो गैर-संवादात्मक प्रसंस्करण के लिए बेहतर है।

लाभ:

  • setlineपाठ्य सामग्री कुछ भी हो सकता है - एक &एक में sedप्रतिस्थापन पाठ अनायास ही प्रभाव हो सकता है।

sedउपयोग करने में बहुत आसान लगता है, लेकिन यह वास्तव में बहुत बढ़िया है जो vimऐसा कर सकता है! आपके उत्तर के लिए बहूत बहूत धन्यवाद!
टॉमटैगके

@TomTsagk अच्छी तरह से, मैं सिर्फ यह वर्णन करना चाहता था कि आप कई फाइलों में कैसे कार्य कर सकते हैं ( bufdo)। विचार करें कि आपके पास फाइलें पहले से खुली हैं और ... और एक वैकल्पिक दिखाने के लिए 1s/foo/bar/
मुरु

Awesoming !!! <3_ <3
कैम्पा

3

कुछ अन्य विकल्प:

  • awk(GNU के अपेक्षाकृत नए संस्करण की आवश्यकता है awk)

    $ awk -i inplace -vline="new line" '(FNR==1){print line; next}1;' *.txt
    
  • पर्ल / खोल

    $ for f in *txt; do
        perl -i -lne '$.==1 ? print "new line" : print' "$f"
      done
    
  • शेल / coreutils

    $ for f in *txt; do 
        ( echo "new line"; tail -n+2 "$f" ) > foo && mv foo "$f"; 
      done
    

2

यह स्क्रिप्ट आपके अनुरोध के अनुसार करेगी, बदले हुए फाइलों को नई निर्देशिका में वास्तव में मूल को बदलने के बिना रखेगी।

d=/tmp/cooked
mkdir $d
for f in *  #will match all files in current directory; adjust as desired
do
  echo "This is the new 1st line" > /${d}/${f}
  sed 1d ${f} >> /${d}/${f}
done

मैं धीमी गति से जवाब दे रहा था (मेरे कोड का परीक्षण किया गया) ... और मुझे हेमायल का घोल बहुत अच्छा लगा!
चार्ल्स बोलिंग

0

का उपयोग करते हुए gawk

gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt

उदाहरण

% cat foo.txt 
1
2
3
4

% cat bar.txt 
1
2
3
4

% gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt

% cat foo.txt                                                    
your_replacement
2
3
4

% cat bar.txt                                                    
your_replacement
2
3
4

0

jEdit: मैं इसे बड़े पैमाने पर खोजने और बदलने के लिए उपयोग करता हूं। यह RegEx - रेगुलर एक्सप्रेशंस का उपयोग करने की क्षमता के साथ शक्तिशाली है। आप एक निर्देशिका के भीतर फ़ाइलों पर काम कर सकते हैं, फ़ाइल एक्सटेंशन निर्दिष्ट कर सकते हैं, उदाहरण के लिए, ".html" और इसके बाद के संस्करण। और, आप GUI में, उम्मीदवार के संदर्भ में परिवर्तन के स्थान को देख सकते हैं। jEdit बहुत अच्छा है।

jEdit उबंटू के सॉफ्टवेयर सेंटर के माध्यम से उपलब्ध है।


0

पूंछ और बिल्ली के आदेश यह आसानी से करेंगे:

tail -n +1 $file > tmpfile
cat newfirstline tmpfile >$file

एक उपयुक्त लूप में लपेटें और शायद एक हार्ड-कोडित अस्थायी फ़ाइल नाम के बजाय एक उचित और धर्मी अस्थायी फ़ाइल का उपयोग करें। मेरा मानना ​​है कि अस्थायी फ़ाइलों को बनाने के लिए बैश और अन्य गोले का एक वाक्यविन्यास है।

पूंछ के -n विकल्प में दो व्याख्याएं हैं जो इस बात पर निर्भर करता है कि तर्क के पास प्लस चिन्ह है या नहीं। यदि इसके पास एक प्लस चिन्ह है तो इसका मतलब है दिए गए लाइन नंबर पर शुरू होने वाली फ़ाइल की पूंछ दिखाना । अन्यथा संख्या लाइनों की संख्या है, जिसमें अंतिम पंक्ति भी शामिल है, यह पूंछ आउटपुट के लिए माना जाता है।

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