किसी अन्य पाठ फ़ाइल के साथ मार्करों के बीच पाठ फ़ाइल के भाग को कैसे बदलें?


26

कहो मेरे पास इस तरह एक पाठ फ़ाइल है:

# custom content section
a
b

### BEGIN GENERATED CONTENT
c
d
### END GENERATED CONTENT

मैं GENERATED CONTENTटैग्स के बीच के हिस्से को दूसरी फाइल की सामग्री के साथ बदलना चाहूंगा ।

ऐसा करने का सबसे सरल तरीका क्या है?

जवाबों:


36
lead='^### BEGIN GENERATED CONTENT$'
tail='^### END GENERATED CONTENT$'
sed -e "/$lead/,/$tail/{ /$lead/{p; r insert_file
        }; /$tail/p; d }"  existing_file

अति उत्कृष्ट। sedबस से इतना अधिक कर सकते हैं s/.../...!
DevSolar

हम्म्म मेरे लिए काम नहीं करता है, क्या मुझे एक पंक्ति में sed कमांड डालनी चाहिए?
lzap

3
r insert_fileआदेश अपनी लाइन पर आखिरी बात होनी चाहिए। ध्यान दें कि इसके बाद न तो व्हाट्सएप और न ही टिप्पणियों की अनुमति है। जीएनयू का उपयोग करने में सक्षम विकल्प के sedसाथ कोड का परीक्षण किया गया था --posix, और यह अपेक्षित रूप से काम करता था, इसलिए इसे किसी भी पॉज़िक्स के अनुरूप काम करना चाहिए sed
पीटर।

1
पवित्र मोली, यह अच्छा है! यह मेरे sed शब्दकोश में जा रहा है! बेहद उपयोगी और खूबसूरती से सरल। धन्यवाद!
डैनियलस्मेडगार्डबस

2
इन-प्लेस एडिटिंग पर ध्यान दें कि आपको sed (उदा output=$(sed -e "..." existing_file)) के आउटपुट को कैप्चर करना होगा और फिर दूसरी पास (जैसे echo "$output" > existing_file) में रिप्लेसमेंट करें क्योंकि आप जिस फाइल से पढ़ रहे हैं उसे रीडायरेक्ट करने की कोशिश करेंगे क्योंकि इससे कॉन्टेंट पढ़ने से पहले ही अलग हो जाएंगे।
क्रिस टोंकिंसन

5
newContent=`cat new_file`
perl -0777 -i -pe "s/(### BEGIN GENERATED CONTENT\\n).*(\\n### END GENERATED CONTENT)/\$1$newContent\$2/s" existing_file

अच्छी नौकरी। मेरी तुलना में बहुत सरल है। :)
डॉ। किट्टी

4

चेतावनी: यह निश्चित रूप से इसे करने का सबसे सरल तरीका नहीं है। (संपादित करें: काम करता है; पोसिक्स ग्रीप भी ठीक है)

यदि मुख्य पाठ "मुख्य" फ़ाइल में है और उत्पन्न सामग्री फ़ाइल "जीन" में है, तो आप निम्न कार्य कर सकते हैं:

#!/bin/bash
BEGIN_GEN=$(cat main | grep -n '### BEGIN GENERATED CONTENT' | sed 's/\(.*\):.*/\1/g')
END_GEN=$(cat main | grep -n '### END GENERATED CONTENT' | sed 's/\(.*\):.*/\1/g')
cat <(head -n $(expr $BEGIN_GEN - 1) main) gen <(tail -n +$(expr $END_GEN + 1) main) >temp
mv temp main

क्या यह काम करता है? मुझे लगता है कि आपकी अंतिम पंक्ति mainलिखने के लिए खुल जाएगी , इसे साफ़ करना, इससे पहले कि यह बिल्ली द्वारा पढ़ा जाए।
chepner

@chepner बकवास, आप सही कह रहे हैं। बाकी काम करता है, यद्यपि। मैं इसे ठीक कर दूंगा।
डॉ। किट्टी

3
ed -s FILE1 <<EOF
/### BEGIN GENERATED/+,/### END GENERATED/-d
/### BEGIN GENERATED/ r FILE2
w
q
EOF

एक वंशानुगत और एड लाइन संपादक का उपयोग करना। हेरेडोक के अंदर की पहली लाइन 'd' को '+' के बाद की लाइन को डिलीट करना है। ### END
जनरेट

खेद है कि मैं क्या मतलब था FILE2 लाइन '### BEGIN उत्पन्न ..' के बाद सम्मिलित किया गया था
Jetchisel

मुझे लोगों पर आसानी से ले लो, यह मेरी पहली बार :-) के बाद है। इसके अलावा, मैंने इस शब्द का भी इस्तेमाल किया होगा, लेकिन दूसरे समाधान में एक हेरेडोक्स नहीं बल्कि एक प्रिंटफ़ और एक पाइप का उपयोग किया गया है। किसी भी तरह से माफी अगर मैं एक गलती की है :-)
Jetchisel

धन्यवाद, बहुत पठनीय! Btw - r FILE2आप के बजाय r !commandएक अलग स्क्रिप्ट से पढ़ने के लिए कह सकते हैं ।
कोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.