एक फ़ाइल के भीतर अन्य फ़ाइल की सामग्री के साथ प्रतिमान


20

मेरे पास एक पाठ फ़ाइल है ( devel.xml)।

मैंने इस स्ट्रिंग को एक अलग फ़ाइल ( temp.txt) के भीतर सामग्री के साथ बदलने के लिए इसमें REPLACETHIS शब्द जोड़ा है ।

मेरे पास सबसे पास की चीज़ है:

sed -i -e "/REPLACETHIS/r temp.TXT" -e "s///" devel.txt;

यह स्ट्रिंग के बाद सामग्री सम्मिलित करता है, और उसके बाद स्ट्रिंग को हटा देता है।

क्या यह करने का सबसे अच्छा तरीका है?


क्या इसे सेड होना है? Temp.txt में कितना पाठ है, इसके आधार पर, मैं एक पर्ल समाधान तक कदम रख सकता हूं।
14:

जवाबों:


34

आपने जो कुछ SUBSTITUTETHISभी किया है, वह फ़ाइल में दिखाई देने वाली जगह को हटाने के लिए है (लेकिन शेष पंक्ति नहीं है जहाँ वह दिखाई देती है) और temp.TXTउस पंक्ति के नीचे की सामग्री डालें । यदि SUBSTITUTETHISएक पंक्ति में कई बार दिखाई देता है, तो केवल पहली घटना को हटा दिया जाता है, और केवल एक प्रति temp.TXTजोड़ी जाती है।

यदि आप SUBSTITUTETHISप्रकट होने पर पूरी पंक्ति को बदलना चाहते हैं , तो dकमांड का उपयोग करें । चूँकि आपको दोनों को चलाने की आवश्यकता है rऔर dजब कोई मैच होगा, तो उन्हें एक लटके हुए समूह में रखें।

sed -e '/SUBSTITUTETHIS/ {' -e 'r temp.TXT' -e 'd' -e '}' -i devel.txt

कुछ sed कार्यान्वयन आप अर्धविराम का उपयोग कमांड को अलग करने के लिए करते हैं और विभाजकों को ब्रेसिज़ के चारों ओर पूरी तरह से छोड़ देते हैं, लेकिन rकमांड को तर्क को समाप्त करने के लिए आपको अभी भी एक नई पंक्ति की आवश्यकता है :

sed -e '/SUBSTITUTETHIS/ {r temp.TXT
                          d}' -i devel.txt

यदि आप SUBSTITUTETHISफ़ाइल की सामग्री को बदलना चाहते हैं , लेकिन लाइन पर पहले और बाद में जो आता है उसे बनाए रखें, यह अधिक जटिल है। सबसे सरल विधि फ़ाइल की सामग्री को sed कमांड में शामिल करना है; ध्यान दें कि आपको इसकी सामग्री को ठीक से उद्धृत करना होगा।

sed -e "s/SUBSTITUTETHIS/$(<temp.TXT sed -e 's/[\&/]/\\&/g' -e 's/$/\\n/' | tr -d '\n')/g" -i devel.txt

या पर्ल का उपयोग करें। यह छोटा है लेकिन catप्रत्येक प्रतिस्थापन के लिए एक बार चलता है :

perl -pe 's/SUBSTITUTETHIS/`cat temp.TXT`/ge' -i devel.txt

स्क्रिप्ट शुरू होने पर फ़ाइल को एक बार पढ़ने के लिए, और शेल कमांड के आधार पर बचें:

perl -MFile::Slurp -pe 'BEGIN {$r = read_file("temp.TXT"); chomp($r)}
                        s/SUBSTITUTETHIS/$r/ge' -i devel.txt

(पठनीयता के लिए दो पंक्तियों पर प्रस्तुत किया गया लेकिन आप पंक्ति विराम को छोड़ सकते हैं)। यदि फ़ाइल नाम परिवर्तनशील है, तो मुद्दों को उद्धृत करने से बचने के लिए, इसे पर्यावरण चर के माध्यम से स्क्रिप्ट में पास करें:

replacement_file=temp.TXT perl -MFile::Slurp -pe 'BEGIN {$r = read_file($replacement_file); chomp($r)}
                        s/SUBSTITUTETHIS/$r/ge' -i devel.txt

मैं पर्ल कमांड को कैसे बदल सकता हूं ताकि इसके बजाय cat temp.txtमैं कर सकूं cat ${variable}?
मारिया इनेस परनिरी

@MariaInesParnisari मैंने टिप्पणी स्वरूपण में गलती की। थोड़ा अलग, अधिक मजबूत समाधान के साथ मेरा जवाब देखें।
गिल्स एसओ- बुराई को रोकना '

चूंकि फ़ाइल :: स्लरप हमेशा स्थापित नहीं होती है, एक विकल्प यह है -0777कि पूरी फ़ाइल में openperl -0777 -pe 'BEGIN {open F, q(temp.TXT); $r=<F>; chomp($r)} s/SUBSTITUTETHIS/$r/ge' -i devel.txt
स्लरप

r temp.TXT"BEGIN temp.TXT", "END temp.TXX" जैसे संदेशों के साथ कैसे लपेटें
kyb

मुझे अपने प्रश्न का हल मिल गया। उपयोग a(जोड़ें) कमांड। grymoire.com/Unix/Sed.html#uh-36
kyb
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.