2016-03-07 59 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 但重要的是确保您的输入是原始的和格式良好的。