unix搜索字符串中的子字符串

时间:2016-03-07 23:48:25

标签: linux bash unix

如何在以下字符串中提取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字段进行搜索。

3 个答案:

答案 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解析器的DOMSAXStAX等。 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工具..只需使用-o选项grep你的字符串,以获得所需的标记及其内容(-o只返回与正则表达式逐行匹配的字符串)和然后使用cutsed或任何其他工具删除代码:

$ 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 但最重要的是确保你的输入是原始的和良好的形式。