1

我有一个输出:

 <artifactId>prj-parent</artifactId>
 <version>1.11.1-Beta01-SNAPSHOT</version>

如何使用 linux 命令仅提取 1.11.1-Beta01-SNAPSHOT ?谢谢!

4

6 回答 6

5

您可以使用grep

  echo $string | grep -P -o '(?<=<version>).*?(?=</version>)'
于 2012-04-09T12:14:49.763 回答
3
grep '<version>' | replace "<version>" "" "</version>" ""

每行一个条目

于 2012-04-09T12:12:18.693 回答
3
awk -F '[<>]' '$2 == "version" {print $3}'
于 2012-04-09T13:07:00.610 回答
2

GNU sed:

sed -nr '/<\/?version>/s///gp'
于 2012-04-09T12:21:04.410 回答
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
于 2012-04-09T12:14:42.490 回答
1

发射器:

$ 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。在evalfalse将创建一个失败的终止状态:

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 提取了一些错误的文本作为版本。

最好的方法是编写非常具体的匹配,它只允许输入之间相关的预期变化,并且如果存在不匹配则抱怨。

于 2012-04-09T18:18:58.673 回答