我有一个输出:
<artifactId>prj-parent</artifactId>
<version>1.11.1-Beta01-SNAPSHOT</version>
如何使用 linux 命令仅提取 1.11.1-Beta01-SNAPSHOT ?谢谢!
您可以使用grep
:
echo $string | grep -P -o '(?<=<version>).*?(?=</version>)'
grep '<version>' | replace "<version>" "" "</version>" ""
每行一个条目
awk -F '[<>]' '$2 == "version" {print $3}'
GNU sed:
sed -nr '/<\/?version>/s///gp'
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
发射器:
$ 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
找不到匹配项,它将失败并打印 word 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,而您的 regex hack 提取了一些错误的文本作为版本。
最好的方法是编写非常具体的匹配,它只允许输入之间相关的预期变化,并且如果存在不匹配则抱怨。