2010-03-25 18 views
16

से पहले किसी फ़ाइल की सामग्री को किसी अन्य फ़ाइल में कैसे सम्मिलित कर सकता हूं, मैं एक फ़ाइल की सामग्री को किसी अन्य फ़ाइल में कैसे सरणी का उपयोग कर ठीक से सम्मिलित कर सकता हूं?मैं एक विशिष्ट फ़ाइल

उदाहरण मैं file1.xml कि है निम्नलिखित है:

 <field tagRef="9647"> 
      <description>Offset</description> 
     </field> 
     <field tagRef="9648"> 
      <description>Offset Units/Direction</description> 
     </field> 
     <field tagRef="9646"> 
      <description>Anchor Price</description> 
     </field> 

कैसे मैं सिर्फ

से पहले file1 में करें 2 की सामग्री सम्मिलित कर सकते हैं:

 <field tagRef="376"> 
     </field> 
     <field tagRef="377"> 
     </field> 
     <field tagRef="58"> 
     </field> 
     <group ref="StandardMessageTrailer" required="true"/> 
    </fieldList> 
</message> 

और file2.xml निम्नलिखित है

<group ref="StandardMessageTrailer" required="true"/> 

तो यह इस तरह दिखेगा:

 <field tagRef="376"> 
     </field> 
     <field tagRef="377"> 
     </field> 
     <field tagRef="58"> 
     </field> 
     <field tagRef="9647"> 
      <description>Offset</description> 
     </field> 
     <field tagRef="9648"> 
      <description>Offset Units/Direction</description> 
     </field> 
     <field tagRef="9646"> 
      <description>Anchor Price</description> 
     </field> 
     <group ref="StandardMessageTrailer" required="true"/> 
    </fieldList> 
</message> 

मैं

sed 'group ref="StandardMessageTrailer"/r file2.xml' file1.xml > newfile.xml 

का उपयोग कर उस पंक्ति के बाद सम्मिलित करने के लिए कैसे पता है, लेकिन मैं इससे पहले कि यह सम्मिलित करना चाहते हैं।

, आप एसईडी चाहते हैं, तो मदद

+0

मैं एक वास्तविक एसईडी समाधान को देखने के लिए अच्छा लगेगा - मुझे पता है यह 'की तरह/StandardMessageTrailer/कुछ के साथ संभव हो जाना चाहिए {x; आर डालने, जी}' लेकिन वह काफी यह ... – Cascabel

उत्तर

19
f2="$(<file2)" 
awk -vf2="$f2" '/StandardMessageTrailer/{print f2;print;next}1' file1 

सराहना यहां एक तरह से

sed -e '/StandardMessageTrailer/r file2' -e 'x;$G' file1 
+3

आपका 'sed' नहीं है संस्करण फ़ाइल 1 की अंतिम पंक्ति मुद्रित नहीं करता है। यदि आप 'x 'के बाद' -e' $ g'' जोड़ते हैं तो यह होगा, लेकिन यह विफल हो जाएगा यदि रेगेक्स वाली रेखा उस पंक्ति को प्रिंट करके फ़ाइल 1 में अंतिम पंक्ति है * फिर * फ़ाइल 2 की सामग्री। –

+0

@ डेनिस धन्यवाद। अंतिम पंक्ति regex मुद्दे के संबंध में। मैं इस पर शर्त लगाऊंगा, अभी के लिए नहीं। :) जैसा कि आप देख सकते हैं, मेरा पसंदीदा समाधान sed नहीं है। – ghostdog74

+1

मैकोज़ पर, आप कमांड में -i.bak जोड़कर फ़ाइल में सीधे परिवर्तन लिख सकते हैं: 'sed -i.bak -e'/standardMessageTrailer/r file2 '-e' x; $ G 'file1' –

3

आप दो गुजरता बनाने के लिए सहन कर सकते हैं, तो आप एक मार्कर का उपयोग कर सकते हैं:

sed '/Standard/i MARKER' file1.xml | sed -e '/MARKER/r file2.xml' -e '/MARKER/d' 

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

1

आमतौर पर मैं इस तरह कार्य करें:

  1. file1, फ़ाइल डालने सामग्री
  2. करें 2, के सिर पर से file1 पढ़ने सामग्री सम्मिलित पढ़ने के लिए करें 2
  3. स्क्रिप्ट स्निपेट:

    sed "\$r ${file2}" ${file1} > tmpfile
    mv tmpfile ${file2}

0

मैं अलग समाधान की कोशिश की और बीटा से एक मेरे लिए काम किया है।

सारांश:

  • मैं एक मुख्य फ़ाइल
  • मैं मार्कर का उपयोग करने के कहने के लिए है, जहां मैं

उदाहरण सम्मिलित करने के लिए इन फ़ाइलों को चाहता था चाहता था में विभिन्न फ़ाइलें सम्मिलित करना चाहता था :
2 फाइलें बनाएं:

,210

cloud_config.yml:

coreos: 
__ETCD2__ 

etcd2.yml:

etcd2: 
    name:       __HOSTNAME__ 
    listen-peer-urls:    http://__IP_PUBLIC__:2380 
    listen-client-urls:   http://__IP_PUBLIC__:2379,http://127.0.0.1:2379 

तो हम उस पर है कि स्क्रिप्ट चलाने:

sed '/Standard/i __ETCD2__' cloud_config.yml \ 
| sed -e "/__ETCD2__/r etcd2.yml" > tmpfile 
sed "s|__ETCD2__||g" tmpfile > cloud_config.yml 

अंत में, हम है कि मिल गया है:

coreos: 
    etcd2: 
    name:       __HOSTNAME__ 
    listen-peer-urls:    http://__IP_PUBLIC__:2380 
    listen-client-urls:   http://__IP_PUBLIC__:2379,http://127.0.0.1:2379 
संबंधित मुद्दे