如何在以下字符串中提取currency1字段:
<fxQuotation><currency1>USD</currency1><currency2>AUD</currency2>
结果应为USD。
以下命令可行:
echo "<fxQuotation><currency1>USD</currency1><currency2>AUD</currency2>" | cut -d">" -f3 | cut -d"<" -f1
但是,如果该字符串是一个非常大的xml文件中的子字符串,那么我的命令将不起作用。如何根据currency1字段进行搜索。
答案 0 :(得分:2)
使用xidel非常轻松:
xidel file.xml --extract "//currency1" -q
或
xidel file.xml --xpath "//currency1" -q
这两个使用格式错误的XML / HTML / XML文本......
答案 1 :(得分:1)
使用xml解析器或xml查询语言而不是正则表达式和bash命令会更好。
对于Java,请参阅基于xml解析器的DOM
,SAX
,StAX
等。 DOM
将所有xml加载为内存中的树表示,因此速度快但内存效率低;另一方面SAX
和StAX
在拉动或推动时尚射击事件中处理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工具..只需使用-o
选项grep你的字符串,以获得所需的标记及其内容(-o
只返回与正则表达式逐行匹配的字符串)和然后使用cut
或sed
或任何其他工具删除代码:
$ 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
$
答案 2 :(得分:1)
你最好使用C或Python中的小型自定义程序,但是&#39; awk&#39;并且&#39; sed&#39;是旧工具,可以在shell脚本中提供简单的解决方案: 见Print XML element with AWK 但最重要的是确保你的输入是原始的和良好的形式。