2013-06-20 46 views
1

去除這裏的XML標記是我的XML文件中的一個片段用正則表達式工具

<layoutItems> 
      <behavior>Edit</behavior> 
      <field>ID</field> 
</layoutItems> 
<layoutItems> 
      <page>lastViewedAccount</page> 
      <showLabel>false</showLabel> 
      <showScrollbars>false</showScrollbars> 
      <width>100%</width> 
</layoutItems> 
<layoutItems> 
      <behavior>Required</behavior> 
      <field>Name</field> 
</layoutItems> 

我想刪除中間的部分即

<layoutItems> 
      <page>lastViewedAccount</page> 
      <showLabel>false</showLabel> 
      <showScrollbars>false</showScrollbars> 
      <width>100%</width> 
</layoutItems> 

這部分可以在任何地方的文件中一起出現與其他標籤。

使用一些字符串操作工具刪除它的最佳方法是什麼?我一直在嘗試與sed運氣,但沒有成功。任何幫助,將不勝感激。

+3

這不適用於'sed'或'AWK反正。使用XML解析器。 – devnull

+0

我與@devnull。使用正則表達式處理xml會變得混亂 – hek2mgl

+0

我試圖避免通過程序來完成它,因爲這項工作是在bash中完成的。但我可以做到這一點。 – auny

回答

3

請注意:你應該提供儘可能多的信息,你可以。一般說來解析,等用不是好主意,總是用-和-tool!以下代碼可能同時對您有所幫助。所以也請注意:它可能與失敗與其他文件和其他結構! 請勿在生產中使用!我假設沒有保修!

sed -r '/<layoutItems>/{:ka;N;s#(</layoutItems>)#\1#;Tka;s/lastViewedAccount//;T;d}' file 

Inputfile中與2個lastViewedAccount標籤:

<?xml version="1.0" encoding="UTF-8"?> 
    <Layout xmlns="http://test.com/2006/04/metadata"> 
     <emailDefault>false</emailDefault> 
     <headers>PersonalTagging</headers> 
     <headers>PublicTagging</headers> 
     <layoutSections> 
      <customLabel>false</customLabel> 
      <detailHeading>false</detailHeading> 
      <editHeading>true</editHeading> 
      <label>Account Information</label> 
      <layoutColumns> 
       <layoutItems> 
        <page>lastViewedAccount</page> 
        <showLabel>false</showLabel> 
        <showScrollbars>false</showScrollbars> 
        <width>100%</width> 
       </layoutItems> 
       <layoutItems> 
        <behavior>Edit</behavior> 
        <field>OwnerId</field> 
       </layoutItems> 
       <layoutItems> 
        <behavior>Required</behavior> 
        <field>Name</field> 
       </layoutItems> 
       <layoutItems> 
        <behavior>Edit</behavior> 
        <field>ParentId</field> 
       </layoutItems> 
       <layoutItems> 
        <behavior>Edit</behavior> 
        <field>AccountNumber</field> 
       </layoutItems> 
       <layoutItems> 
        <page>lastViewedAccount</page> 
        <showLabel>false</showLabel> 
        <showScrollbars>false</showScrollbars> 
        <width>100%</width> 
       </layoutItems> 
       <layoutItems> 
        <behavior>Edit</behavior> 
        <field>Site</field> 
       </layoutItems> 
      </layoutColumns> 
     </layoutSections> 
    </Layout> 

OUTPUTFILE,lastViewedAccount標籤移除:

<?xml version="1.0" encoding="UTF-8"?> 
    <Layout xmlns="http://test.com/2006/04/metadata"> 
     <emailDefault>false</emailDefault> 
     <headers>PersonalTagging</headers> 
     <headers>PublicTagging</headers> 
     <layoutSections> 
      <customLabel>false</customLabel> 
      <detailHeading>false</detailHeading> 
      <editHeading>true</editHeading> 
      <label>Account Information</label> 
      <layoutColumns> 
       <layoutItems> 
        <behavior>Edit</behavior> 
        <field>OwnerId</field> 
       </layoutItems> 
       <layoutItems> 
        <behavior>Required</behavior> 
        <field>Name</field> 
       </layoutItems> 
       <layoutItems> 
        <behavior>Edit</behavior> 
        <field>ParentId</field> 
       </layoutItems> 
       <layoutItems> 
        <behavior>Edit</behavior> 
        <field>AccountNumber</field> 
       </layoutItems> 
       <layoutItems> 
        <behavior>Edit</behavior> 
        <field>Site</field> 
       </layoutItems> 
      </layoutColumns> 
     </layoutSections> 
    </Layout> 
+0

是的,我知道不應該這樣做,應該使用解析器工具。實際上這個項目是在我沒有程序自由的bash環境中所需要的。 – auny

+0

它工作正常。謝謝 – auny

1

GNU

sed -nr 'H; \#</layoutItems>#{x;s/(lastViewedAccount)/\1/;Tk;p;:k;x;s/.*//;x;s///;x;d}' file 

$sed -nr 'H; \#</layoutItems>#{x;s/(lastViewedAccount)/\1/;Tk;p;:k;x;s/.*//;x;s///;x;d}' file 

    <layoutItems> 
      <page>lastViewedAccount</page> 
      <showLabel>false</showLabel> 
      <showScrollbars>false</showScrollbars> 
      <width>100%</width> 
    </layoutItems> 
+0

這只是找到這部分和文件中的所有先前部分即該標籤。假設在該標籤之前還有其他標籤。它也不是從文件中刪除 – auny

相關問題