2010-03-25 92 views
16

如何在使用sed的特定行之前將文件內容插入另一個文件?如何在特定行之前將文件內容插入另一個文件

的例子,我有一個具有以下file1.xml:

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

和file2.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> 

我怎麼能只

之前插入的文件2內容到文件1
<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

我很想看到一個實際的sed解決方案 - 我知道這應該是可能的東西像'/ StandardMessageTrailer/{x; r插入; G}'但這不是很... – Cascabel 2010-03-25 00:54:42

回答

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

如果你想SED,這裏有一個方法

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

您的'sed'版本不打印file1的最後一行。如果在''x''之後添加'-e'$ G'',那麼它會,但是如果具有正則表達式的行是file1的最後一行,則通過打印該行然後* file2的內容將失敗。 – 2010-03-25 07:29:47

+0

@dennis謝謝。關於最後一行正則表達式問題。現在,我敢打賭它不會發生。 :)你可以看到,我的首選解決方案不是sed。 – ghostdog74 2010-03-25 08:07:34

+1

在MacOS上,您可以通過在命令中添加-i.bak直接寫入文件:'sed -i.bak -e'/ StandardMessageTrailer/r file2'-e'x; $ G'file1' – 2016-01-22 11:14:35

3

如果你能忍受做兩遍,你可以使用一個標記:

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

試圖一次性完成的麻煩是除了'r'之外沒有辦法(我知道)插入文件的內容,並且'r'在輸出流中是這樣做的,無法操作,之後sed完成了該行。所以如果'標準'在最後一行,那麼無論你用它做什麼都會在file2出現的時候結束。

1

通常我這樣做:

  1. 文件1,文件讀取插入內容
  2. 文件2,在頭從文件1插入閱讀內容文件2
  3. script script snippet:

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

0

我嘗試了不同的解決方案,並從測試版的一個所做的工作對我來說。

摘要:

  • 我想不同的文件插入到主文件
  • 我想用標記說,我想將這些文件插入

例:
創建2個文件:

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 
相關問題