我有一个输出:
<artifactId>prj-parent</artifactId>
<version>1.11.1-Beta01-SNAPSHOT</version>
如何使用linux命令仅提取1.11.1-Beta01-SNAPSHOT? 谢谢!
答案 0 :(得分:5)
您可以使用grep
:
echo $string | grep -P -o '(?<=<version>).*?(?=</version>)'
答案 1 :(得分:3)
grep '<version>' | replace "<version>" "" "</version>" ""
每行一个条目
答案 2 :(得分:3)
awk -F '[<>]' '$2 == "version" {print $3}'
答案 3 :(得分:2)
GNU sed:
sed -nr '/<\/?version>/s///gp'
答案 4 :(得分:1)
a="<artifactId>prj-parent</artifactId>\n<version>1.11.1-Beta01-SNAPSHOT</version>"
echo $a | grep -oe "<version>.*</version>" | cut -d">" -f2- | cut -d"<" -f1
答案 5 :(得分:1)
TXR:
$ txr -c "@(skip)
<artifactId>@aid</artifactId>
<version>@version</version>" data.txt
aid="prj-parent"
version="1.11.1-Beta01-SNAPSHOT"
仅设置eval
命令和shell变量version
。您可以检查aid
以获取正确的工件ID。如果txr
找不到匹配项,则会失败并打印单词false
。在eval
下,此false
将创建失败的终止状态:
if $(txr -c "@(skip)
<artifactId>@aid</artifactId>
<version>@version</version>") ; then
echo "version captured: $version"
else
echo "failed to match, uh oh!"
fi
使用TXR提取XML并不像使用XML解析器然后访问节点结构那样理想,但它比使用简单的正则表达式更加健壮,这些正则表达式可以锁定最少量的上下文来完成工作,并且仅用少量例子验证。
对于这些类型的任务,您并没有真正拥有软件工程的奢侈品,而是拥有严格测试套件的解决方案。数据的变化甚至不是预先知道的,或者可能存在大量数据(例如从大日志中提取),其中很难发现错误。 (如果说,日志中每10,000个条目中有2个被提取错误,有人会抓到错误吗?)数据也会改变。明天会有人更改XML,而你的正则表达式黑客会将一些错误的文本拉出来作为版本。
最好的方法是编写非常具体的匹配,只允许输入之间的相关预期变化,并且如果存在不匹配则会抱怨。