更新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和字符串以捕获
答案 0 :(得分:0)
使用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。
它基于所有 root 标签将关闭的条件。
答案 1 :(得分:0)
如果.owl-item{
display:inline-block
}
.owl-wrapper-outer{
width:1115px;
overflow:hidden;
}
可用,如何:
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'的子字符串。$&
之类的话,那就简单多了。不幸的是,到目前为止,(?<!<parent>.*)<version>..
尚未以variable length lookbehind
(和大多数其他语言)实现。答案 2 :(得分:0)
问题指出:
我只能使用本机linux工具而无需安装
和正在使用的linux版本在注释中描述为:
是标准AWS linux
我刚刚检查过,Amazon Linux预先安装了xmllint。
因此,解决方案似乎是:
xmllint --xpath "/*[local-name()='project']/*[local-name()='version']/text()" pom.xml