2016-03-07 58 views
1

子我怎麼能提取以下字符串的CURRENCY1領域:UNIX搜索字符串

<fxQuotation><currency1>USD</currency1><currency2>AUD</currency2> 

結果應該是美元。

以下命令將工作:

echo "<fxQuotation><currency1>USD</currency1><currency2>AUD</currency2>" | cut -d">" -f3 | cut -d"<" -f1 

但是如果該字符串是一個非常大的XML文件的子串,那麼我的命令是行不通的。我如何根據currency1字段進行搜索。

+0

任何原因,特別是你爲什麼不只是使用XML解析器? – Carpetsmoker

+0

,因爲該文件不是純XML(半文本,一半XML),我試圖解析它在Java中,但這導致了錯誤 – user3809938

+0

在我看來,問一個關於這些Java錯誤的問題更有意義?無論如何,像'cut'這樣的工具應該可以很好地工作,即使是非常大的文件。你究竟如何調用它?大概不會像問題中的'echo'那樣? – Carpetsmoker

回答

1

最好使用xml解析器或xml查詢語言而不是正則表達式和bash命令。

對於Java,請參閱DOM,SAXStAX等基於xml的解析器。 DOM加載所有的xml作爲內存中的樹形表示,所以它很快但內存效率低下;另一方面,SAXStAX要好得多,因爲他們處理xml拉或推時尚射擊事件。所以你只需要爲他們的事件編寫事件處理程序。
WoodStox庫是一個好的,高效的和可配置的xml解析器。更多信息:https://www.javacodegeeks.com/2013/05/parsing-xml-using-dom-sax-and-stax-parser-in-java.html
http://www.studytrails.com/java/xml/woodstox/java-xml-stax-woodstox-basic-parsing.jsp

您還可以通過使用XQuery爲xml使用SQL語法;另一種語言來獲取你的數據可以是xpath。

http://www.w3schools.com/xsl/xpath_intro.asp
http://www.w3schools.com/xsl/xquery_intro.asp

但是,如果你仍然堅持使用bash工具..只是用grep的字符串-o選項將其內容一起得到您想要的標籤(-o只返回匹配行正則表達式線,串)使用xidel

$ cat file1 
text text abcd 
cxyz 
xyz 

</rootelement> 
<abcd> 
<xyz><fxQuotation><currency1>USD</currency1><currency2>AUD</currency2></fxQuotation></xyz> 
</abcd> 
</rootelement> 
$ egrep -o '<currency1>[^<]*</currency1>' file1 
<currency1>USD</currency1> 
$ egrep -o '<currency1>[^<]*</currency1>' file1 | sed -r 's/<[^>]*>//g' 
USD 
$ grep -oP '(?<=<currency1>)[^<]*(?=</currency1>)' file1 
USD 
$ 
+0

如果您使用'grep -oP'(?<=)。*?(?= <\/currency1>)''來匹配標籤作爲後視和前視,'sed'可以避免。 –

2

非常簡單:然後使用cutsed或任何其他工具去除標籤

xidel file.xml --extract "//currency1" -q 

xidel file.xml --xpath "//currency1" -q 

與文本格式錯誤的XML/HTML/XML兩個工作...

1

你最好關閉使用C或Python的一個小的自定義程序,但'awk'和'sed'是可以在shell腳本中提供簡單解決方案的舊工具: 請參閱Print XML element with AWK 但重要的是確保您的輸入是原始的和格式良好的。