使用sed和grep从标签获取字符串

时间:2019-02-04 15:05:32

标签: regex xml sed grep

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

3 个答案:

答案 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