2014-05-20 30 views
1

我是bash腳本的初學者,無法解決以下問題:我有一個文件,其中每行都是一個xml文件。我想將每一行分成幾行。如何使用bash腳本將xml行分成幾行?

舉例來說,我想提出以下行:

<LumiBlockCollection><Run>201556</Run><LBRange Start="1020" End="1030"/></LumiBlockCollection> 

到格式:

<LumiBlockCollection> 
<Run>201556</Run> 
<LBRange Start="1020" End="1030"/> 
</LumiBlockCollection> 

有誰知道如何解決這個問題?

+0

您在操作系統上是什麼? – mklement0

+2

如何解決問題?如果你使用XML解析器,這很容易。 –

+0

該腳本將在不同的操作系統中使用。通常,我使用OS X,SL(科學linux)和Fedora。 – user3658088

回答

3

一般來說,對於強大的解決方案,與不同的輸入數據的工作,你應該使用一個XML解析器此任務:基於xmllint


一個解決方案 - xmllint是標準實用程序OS X一些 Linux發行版(例如,Fedora):

echo '<LumiBlockCollection><Run>201556</Run><LBRange Start="1020" End="1030"/></LumiBlockCollection>' \ 
    | XMLLINT_INDENT= xmllint --format - | tail -n +2 

如果你的Linux發行版不配備xmllint,有機會,它可以與你的平臺的軟件包管理器進行安裝;例如,在基於Debian的發行版,例如Ubuntu的sudo apt-get install libxml2-utils


另一種解決方案的基礎上,第三方實用xmlstarlet

echo '<LumiBlockCollection><Run>201556</Run><LBRange Start="1020" End="1030"/></LumiBlockCollection>' \ 
    | xmlstarlet fo --omit-decl --noindent 

獲取xmlstarlet

  • OSX:通過Homebrew安裝與brew install xmlstarlet
  • Linux:很可能是它可以與您的平臺的包管理器一起安裝;例如,在基於Debian的發行版,例如Ubuntu的sudo apt-get install xmlstarlet
+1

正確的路要走。 +1 – Kent

+0

你好,我已經使用你的解決方案,並在三種不同的操作系統上測試:OS X,SL(科學linux)和Fedora。有用!我正在做以下工作:而不是使用printf%s,我在一個do while塊中使用echo $ line,因爲我正在從輸入文件中讀取數據。謝謝!! – user3658088

+0

@ user3658088:不客氣,我很高興聽到它的工作 - 我假設你使用'xmllint'解決方案,對吧? 'printf%s'並不是必須的,所以我將它改爲'echo'以避免分心('printf%s'的優點是它總是可以直接打印字符串(並且不會終止'\ n'),而echo的行爲可以通過shell選項(轉義序列的解釋)來改變)。 – mklement0

0

下面是使用sed一個簡單的解決方案。請注意,如果您有CDATA部分,則會將它們置於其自己的行上:

$ xml='<LumiBlockCollection><Run>201556</Run><LBRange Start="1020" End="1030"/></LumiBlockCollection>' 
$ echo $xml | sed 's/></>\n</g' 
<LumiBlockCollection> 
<Run>201556</Run> 
<LBRange Start="1020" End="1030"/> 
</LumiBlockCollection> 
$ 
+0

你好,謝謝你幫助我。但是,您的解決方案對我無效。我已經在我的筆記本電腦(OS X)中進行了測試,並在'><'之間放置了'n'。 – user3658088