2012-10-09 69 views
2

我們的應用程序在接收端對XML數據進行復制分析。我們的應用程序沒有可用的Java或.NET,但在Unix中運行,因此它具有awk和Perl。從xml中刪除xml聲明使用perl或awk的數據

文件中的XML消息包含:

<?xml version="1.0" encoding="ISO-8859-1" ?> 

我嘗試了一些選項在Perl和awk,讓他們刪除,但不能讓這些工作:

perl -p -i -e "s/<?xml version="1.0" encoding="ISO-8859-1" ?>//g" inputFile 
perl -p -i -e "s/<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>//g" inputFile 
perl -p -i -e "s/<\?xml version="1.0" encoding="ISO-8859-1" \?>//g" inputFile 

任何其他選項使用PERL或AWK來做到這一點?

+1

在「接收」XML時是否使用了XML解析器? XML聲明對於解析器非常有用,並且嘗試用除解析器之外的任何其他任何東西來處理任何重要的XML將導致瘋狂。而且,如果你使用的是Unix,那麼你可以使用各種語言,如果你安裝它們的話。 –

+0

查看「[如何使用awk,Perl或Python挖掘XML文檔?](http://stackoverflow.com/a/909076/128421)」以獲取相關答案。 –

+0

你的Perl代碼不工作,因爲'?'是一個正則表達式元字符。在每種情況下用'.'或'\?'替換'?',你應該沒問題。 –

回答

1

這爲我工作,而不會覆蓋數據文件:

perl -p -e 's/<\?xml version="1.0" encoding="ISO-8859-1" \?>//g' 

我只覆蓋文件(-i)當我確定我會得到基本的正則表達式工作不會造成傷害。

+0

謝謝@JonathanLeffler。有效。 – diaryfolio

1

如果您的文件是XML,則不必匹配整個字符串。 <?xml version就夠了。

嘗試:

sed -i '/<\?xml version/d' file 

測試

kent$ echo '<?xml version="1.0" encoding="ISO-8859-1" ?> 
foo 
bar 
xyz 
hello 
there'|sed '/<\?xml version/d' 
foo 
bar 
xyz 
hello 
there 
+0

,它沒有工作。 「sed:非法選項 - 我」。我嘗試沒有「-i」選項,但它錯誤地截斷了消息。 – diaryfolio

+0

@diaryfolio在答案中看到了測試,它確實給了你想要的東西,不是嗎? – Kent

+0

'$ cat inputFile.xml <?xml version =「1.0」encoding =「ISO-8859-1」?>星期一' '$ cat inputFile.xml | sed'/ <\?xml version/d'' '$' 似乎它截斷了整個消息 – diaryfolio