2016-11-28 80 views
0

我有一個XML文件格式合併多條線路與條件

<movie> 
<title>Title</title> 
<originaltitle>Original Title</originaltitle> 
<id>ID1234</id> 
</movie> 

我沒有使用SED合併原來的標題和ID標籤,如下圖所示:

<movie> 
<title>Title</title> 
<originaltitle>ID1234 - Original Title</originaltitle> 
</movie> 

如何我可以將匹配保存在ID上,並在修改標題標籤時在別處重新使用它嗎?請注意,id標籤是可選的,因此並不總是存在,在這種情況下,原始標題應保持不變。我可以編寫一個腳本來遍歷文件標籤並達到相同的效果,但我認爲有人可能會爲此提出一個優雅的sed解決方案。任何想法 ?我可以單獨匹配每個條目,但我不知道如何保留一個稍後使用它。到目前爲止,我已經得到了這個,這不起作用

sed '/<id>(.*)<\/id>/ {s/<sorttitle>(.*)<\/sorttitle>/<sorttitle>\1 - \2<\/sorttitle>/}' movie.nfo 
+0

必要的訓誡:http://stackoverflow.com/q/1732348/1072112 – ghoti

+0

正如其他人所指出的那樣,使用面向行的工具來處理XML是不是一個好主意。此外,標題和ID的結合似乎是一個非常糟糕的主意。 –

回答

0

不要使用sed處理XML文件,請使用XML-aware工具。

我目前維持xsh,讓您的任務很簡單:

open file.xml ; 
insert text " - " prepend /movie/originaltitle ; 
move /movie/id/text() prepend /movie/originaltitle ; 
delete /movie/id ; 
save :b ; 
0

如果你喜歡(GNU)的sed,然後 下面的命令來解決這個:

sed -e 'N;' \ 
    -e '/<\/id>$/ s/<originaltitle>\(.*\)<\/originaltitle>\n<id>\(.*\)<\/id>/<originaltitle>\2 - \1<\originaltitle>/;' movie.nfo 

第一條命令可以讓你始終閱讀2行。

噹噹前模式空間的結尾包含</id>時,第二個命令總是被觸發。現在,您只需重新排列標籤並翻轉id和originaltitle值(通過s命令)即可。

0

在awk中。一旦讀取了<originaltitle><id>,將它們合併並打印。預計標籤和結束標籤將位於同一記錄中。

$ awk '/<originaltitle>/ { i++; ot=$0; next } 
        /<id>/ { i++; gsub(/<\/?id>/,""); id=$0; next } 
        i==2 { i=""; sub(/<originaltitle>/,"&" id " - ",ot); print ot } 
     1' file 
<movie> 
<title>Title</title> 
<originaltitle>ID1234 - Original Title</originaltitle> 
</movie>