更新2我想我需要一些简单,因为这: Regex with negative lookahead across multiple lines
获得第一个地方是不是由家长先于我曾尝试没有成功
((?<![<parent>]))<version>.*
或本但仍捕获所有版本的:
(?<!^<parent>)<version>(?!<\/parent>)
如何从使用SED和grep标签我尝试捕捉标签字符串:<groupId>org.test.proj.assent</groupId>
<artifactId>mainapp</artifactId>
<version>mainapp.1.4</version>
<packaging>pom</packaging>
<name>main app 1</name>
然后从那里我想我会提取字符串:
<version>mainapp.1.4</version>
我想这:
sed -n '/version/,/version/p' pom.xml | grep -o -e '<version>.*'
但它给了我所有版本
我也尝试捕捉:
sed -n '/\/artifactId/,/\/version/p' pom.xml | grep -o -e '<version>.*'
但所有的文件被打印
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" >
<modelVersion>55.0.0</modelVersion>
<parent>
<groupId>org.test.proj</groupId>
<artifactId>test-invoker</artifactId>
<version>invoker.0.4</version>
</parent>
<groupId>org.test.proj.assent</groupId>
<artifactId>mainapp</artifactId>
<version>mainapp.1.4</version>
<packaging>pom</packaging>
<name>main app 1</name>
<properties>
<app-name>Testing App</app-name>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.prod.db</groupId>
<artifactId>srver-db</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
我只能使用原生的Linux工具没有安装
更新后的XML和字符串捕捉
随着GNU AWK:
$ awk '/<project/{next} !s && match($0, /<([a-zA-Z]+)>/, tag){s=1} s && ($0~ "</" tag[1] ">"){s=0} !s && match($0, "<version>([^<]*)</version>", ver) {print ver[1]}' file
mainapp.1.4
$ awk '/<project/{next} !s && match($0, /<([a-zA-Z]+)>/, tag){s=1} s && ($0~ "</" tag[1] ">"){s=0} !s && match($0, "<version>([^<]*)</version>", ver) {print ver[0]}' file
<version>mainapp.1.4</version>
放入几行以便于阅读:
awk '/<project/{next}
!s && match($0, /<([a-zA-Z]+)>/, tag){s=1}
s && ($0~ "</" tag[1] ">"){s=0}
!s && match($0, "<version>([^<]*)</version>", ver) {print ver[1]}' file
使用ver[0]
包括标签本身,ver[1]
对于刚刚的innerText。
它是基于所有的根标签将关闭状态。
如果Perl
是可用的,怎么样:
perl -0777 -ne '
while (m#(<parent>.*</parent>)|(?<=<version>)(.*?)(?=</version>)#sg)
{print $&, "\n" if $& !~ /(^\$|parent)/}' file.xml
虽然你可能仍然觉得这不是简单:)。
说明:
-0777
选项告诉perl
到啜所有线路,使图案多行匹配。<parent\>..</parent>
和<version>..</version>
:正则表达式的两个模式相匹配。前者的目的是跳过与<version>
标签内<parent>
标签匹配。$&
不包括与“$”开头或包含“父”的人。(?<!<parent>.*)<version>..
你提到,它就会简单得多。不幸的是variable length lookbehind
不Perl
(和大多数其他语言)截至目前实现的。问题状态:
我只能使用原生的Linux工具没有安装
和Linux的正在使用的版本在注释中被描述为:
是标准的Linux AWS
我刚才检查,Amazon Linux自带xmllint预装。
因此,一个解决办法似乎是:
xmllint --xpath "/*[local-name()='project']/*[local-name()='version']/text()" pom.xml