使用SED和grep标签获取字符串

问题描述 投票:0回答:3

更新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和字符串捕捉

regex xml sed grep
3个回答
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。

它是基于所有的根标签将关闭状态。


0
投票

如果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 lookbehindPerl(和大多数其他语言)截至目前实现的。

0
投票

问题状态:

我只能使用原生的Linux工具没有安装

和Linux的正在使用的版本在注释中被描述为:

是标准的Linux AWS

我刚才检查,Amazon Linux自带xmllint预装。

因此,一个解决办法似乎是:

xmllint --xpath "/*[local-name()='project']/*[local-name()='version']/text()" pom.xml
© www.soinside.com 2019 - 2024. All rights reserved.