स्ट्रिंग का उपयोग करके फ़ाइल की सामग्री के साथ स्ट्रिंग बदलें


23

मेरे पास दो अलग-अलग फाइलें हैं:

file1

/home/user1/  
/home/user2/bin  
/home/user1/a/b/c

करें 2

<TEXT1>
<TEXT2>

मैं File1 की सामग्री का उपयोग करके File2<TEXT1> की जगह लेना चाहता हूं । मैंने इस कमांड की कोशिश की, लेकिन उचित आउटपुट नहीं मिल रहा:sed

cat File2|sed "s/<TEXT1>/$(cat File1|sed 's/\//\\\//g'|sed 's/$/\\n/g'|tr -d "\n")/g"

आप इस समस्या को हल करने के लिए अन्य उपकरणों का भी उपयोग कर सकते हैं।


कृपया उस त्रुटि संदेश को पेस्ट करें ताकि हम उसके स्रोत का पता लगा सकें। हमें यह भी बताएं कि आप किस sedकार्यान्वयन का उपयोग कर रहे हैं। आप कोड मेरे लिए जीएनयू के साथ काम करते हैं sed
मैनटवर्क

क्षमा करें, त्रुटि नहीं हो रही है। मुझे वांछित आउटपुट नहीं मिल रहा है। आउटपुट जैसा है /home/user1/ n/home/user2/bin n/home/user1/a/b/cn <TEXT2>। नई लाइनें नहीं मिल रही हैं।
चंचल

सुनिश्चित नहीं है कि यह आपके विशिष्ट मामले में लागू होगा, लेकिन इसके साथ diffऔर patchउपकरण फ़ाइल में कुछ पंक्तियों को अन्य लाइनों द्वारा काफी आसानी से बदलने की अनुमति देते हैं।
स्टीफन जिमेनेज़ 14

1
Btw, $()एक यादृच्छिक स्क्रिप्ट के साथ इकट्ठा किए गए यादृच्छिक डेटा का उपयोग करने से मेरी आँखें खराब हो जाती हैं। कभी भी उन स्थानों पर बाहरी डेटा का उपयोग करें जहां कुछ वर्णों की व्याख्या विशेष अर्थ के साथ की जाती है।
स्टीफन जिमेनेज़

जवाबों:


24

यहां एक सीड स्क्रिप्ट सॉल्यूशन है (कमांड लाइन पर इसे एक लाइन में लाने की कोशिश करने की तुलना में आंखों पर आसान):

/<TEXT1>/ {
  r File1
  d
}

इसे चलाना:

$ sed -f script.sed File2
/home/user1/
/home/user2/bin
/home/user1/a/b/c
<TEXT2>

धन्यवाद यह काम कर रहा है। लेकिन मैं किसी अन्य स्क्रिप्ट फ़ाइल का उपयोग नहीं करना चाहता। क्या कोई इनलाइन समाधान है?
चंचल

सुनिश्चित करें: sed '/<TEXT1>/{rFile1^Md^M}' File2जहां "^ M" आप रिटर्न दबा रहे हैं। समस्या यह है कि sed को वास्तव में r और d कमांड को परिसीमित करने के लिए {...} के भीतर नईलाइनों की आवश्यकता होती है।
Kusalananda

6
बैश के साथ, पॉज़िक्स-शैली के तार थोड़े साफ होते हैं:sed $'/<TEXT1>/ {r File1\n d}'
ग्लेन जैकमैन

9
इसके अलावा -E के लिए एक लाइनर:sed -e '/<TEXT1>/{r File1' -e 'd}' File2
sauau

1
और क्या होगा अगर पूरी लाइन युक्त की जगह <TEXT1>, मैं सिर्फ स्ट्रिंग को बदलना चाहता हूं, बाकी लाइन को बरकरार रखते हुए? Text1: <TEXT1>को Text1: <file_contents>
रॉबिन विंसलो

9

वर्जन रिप्लेसमेंट का उपयोग करके इस समाधान को खोजने के लिए मुझे एक लंबा समय लगा। सभी sed समाधान मेरे लिए काम नहीं करते थे, क्योंकि वे या तो पूरी लाइनों को हटा देते हैं या गलत तरीके से प्रतिस्थापित करते हैं।

FILE2=$(<file2)
FILE1=$(<file1)
echo "${FILE2//TEXT1/$FILE1}" 

T1 की सभी घटनाओं को फाइल 1 की सामग्री के खिलाफ फाइल 2 में बदल देता है। अन्य सभी पाठ अछूते नहीं हैं।


बहुत अच्छा। संभवतः इससे sedभी तेज , क्योंकि उन "विस्तार" (उर्फ प्रतिस्थापन) को शेल में बनाया गया है ( bashकम से कम)
मधुर-पीला

7

मैं उत्तर देता हूं क्योंकि diff/ patchविधि कुछ मामलों में रुचि हो सकती है। उपयोग blob1में निहित लाइनों द्वारा फाइल में निहित लाइनों के एक प्रतिस्थापन को परिभाषित करने के blob2लिए:

diff -u blob1 blob2 > patch-file

उदाहरण के लिए, यदि blob1इसमें शामिल हैं:

hello
you

और blob2इसमें शामिल हैं:

be
welcome
here

उत्पन्न patch-fileहोगा:

--- blob1   2011-09-08 16:42:24.000000000 +0200
+++ blob2   2011-09-08 16:50:48.000000000 +0200
@@ -1,2 +1,3 @@
-hello
-you
+be
+welcome
+here

अब, आप इस पैच को किसी अन्य फ़ाइल पर लागू कर सकते हैं:

patch somefile patch-file

यह स्थान ले लेगा hello, youद्वारा लाइनों be, welcome, hereमें लाइनों somefile


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