2013-11-27 38 views
0

我有以下格式在.xml文件許多實例:SED(或其他查找和替換);改變嵌入式標籤

<FFFFF> 
    <BBBBB> 
     "good B data" 
    </BBBBB> 
    <BBBBB> 
     "more good B data" 
    </BBBBB> 
</FFFFF> 


<AAAAA> 
    <BBBBB> 
     "some data" 
    </BBBBB> 
    <BBBBB> 
     "more B data" 
    </BBBBB> 
</AAAAA> 

我想將A標籤和重命名是在A標籤在B標籤;所以最終的結果將是:(請注意,重命名的B標記的任何標記也將被罰款,他們只是不能再B)

<FFFFF> 
    <BBBBB> 
     "good B data" 
    </BBBBB> 
    <BBBBB> 
     "more good B data" 
    </BBBBB> 
</FFFFF> 

<AAAAA> 
     "some data" 
</AAAAA> 
<AAAAA> 
     "more B data" 
</AAAAA> 

我一直與SED瞎搞,但我想不出怎麼做。每個A中沒有一定數量的B標籤(有的沒有,有的可能有20個,等等)。另一個問題是我不想刪除其他地方存在的B標籤;所以我不能做一個簡單的查找和替換B標籤,因爲這會改變嵌入的標籤。

任何協助讚賞,謝謝!

+0

爲此,您可能實際上想要在Python/Ruby/etc中使用xml解析器(它看起來像xml,無論如何)。我不認爲sed本身可以解決這個問題。 – iamnotmaynard

+0

是的,它是xml;有你推薦的嗎? –

+0

如果您使用Python,[美麗的湯](http://www.crummy.com/software/BeautifulSoup/)似乎是最受歡迎的。我無法想象任何Ruby的頭頂,但搜索「ruby xml」應該會爲你帶來一堆火柴。 (編輯:Nokogiri是Ruby的一種流行解析器。) – iamnotmaynard

回答

1
$ cat file 
<FFFFF> 
    <BBBBB> 
     "good B data" 
    </BBBBB> 
    <BBBBB> 
     "more good B data" 
    </BBBBB> 
</FFFFF> 


<AAAAA> 
    <BBBBB> 
     "some data" 
    </BBBBB> 
    <BBBBB> 
     "more B data" 
    </BBBBB> 
</AAAAA> 

$ cat tst.awk 
BEGIN{ remove="AAAAA"; changeFrom="BBBBB"; changeTo="XXXXX" } 

$1 ~ "^<" remove ">$" { 
    inRemove = 1 
    next 
} 

inRemove { 
    if ($1 ~ "^</" remove ">$") { 
     inRemove = 0 
     next 
    } 
    else if ($1 ~ "^</?" changeFrom ">$") { 
     sub(changeFrom,changeTo) 
    } 
    sub(/^ /,"") 
} 

{ print } 

$ awk -f tst.awk file 
<FFFFF> 
    <BBBBB> 
     "good B data" 
    </BBBBB> 
    <BBBBB> 
     "more good B data" 
    </BBBBB> 
</FFFFF> 


<XXXXX> 
    "some data" 
</XXXXX> 
<XXXXX> 
    "more B data" 
</XXXXX> 
0
sed '/^<AAAAA>/,/^<\/AAAAA>/ { 
    /^<\/*AAAAA>/ s/^<\/*AAAAA>// 
    /^<\/*AAAAA>/ !{ 
     s/^\([[:space:]]*\)<\(\/*\)BBBBB>/\1<\2AAAAA>/ 
     } 
    }' YourFile 
  1. 這是你的樣品,所以也許這可能是有用的使用變量爲TAG搜索/修改修改標籤的前
  2. 空間(縮進)不變
  3. 包含舊的行只是空的,但仍然存在