脚本:如何针对特定的pom.xml文件并提取标记中的特定值

脚本:如何针对特定的pom.xml文件并提取标记中的特定值,xml,linux,bash,unix,maven,Xml,Linux,Bash,Unix,Maven,我正在努力完成以下任务: 在名为“pom.xml”的目录层次结构中查找所有文件。(不显示结果) 然后,我将使用“Maven\u CAS\u parent”或“Maven\u JAB\u parent”的父/工件标识这些“pom.xml”。(我需要pom.xml路径和父工件ID) 过滤之后,在范围“pom.xml”中,我尝试将父/版本值提取到一个名为“check.txt”的文本文件中。(这里我需要父版本) 其中一个“pom.xml”如下所示(简化版): 我对这个很陌生,但我得到了以下命令。我知道这

我正在努力完成以下任务:

  • 在名为“pom.xml”的目录层次结构中查找所有文件。(不显示结果)
  • 然后,我将使用“Maven\u CAS\u parent”或“Maven\u JAB\u parent”的父/工件标识这些“pom.xml”。(我需要pom.xml路径和父工件ID)
  • 过滤之后,在范围“pom.xml”中,我尝试将父/版本值提取到一个名为“check.txt”的文本文件中。(这里我需要父版本)
  • 其中一个“pom.xml”如下所示(简化版):

    我对这个很陌生,但我得到了以下命令。我知道这个命令不起作用,也不会创建check.txt文件,但如何修复它或编写新文件

    #!/bin/bash
    check()
    {
    echo -e 'setns x=http://maven.apache.org/POM/4.0.0\ncat /x:project/x:parent/x:version/text()' | xmllint --shell pom.xml | grep -v /
    }
    
    find . -type f -name pom.xml | xargs grep 'Maven_CAS_Parent\|Maven_JAB_Parent' | Check
    

    您可以通过在
    find
    找到的文件上循环执行此操作,如下例所示:

    while IFS= read -r file
    do
        artifactId=$(xmllint --format --shell "$file" <<< "cat //parent/artifactId/text()" | grep -v /)
        if [[ $artifactId =~ ^(Maven_CAS_Parent|Maven_JAB_Parent)$ ]]
        then
            version=$(xmllint --format --shell "$file" <<< "cat //parent/version/text()" | grep -v /)
        else
            artifactId="Out of scope"
            version=""
        fi
        echo "$file $artifactId $version"    
    done < <(find . -type f -name "pom.xml")
    
    而IFS=read-r文件
    做
    
    artifactId=$(xmllint--format--shell“$file”将grep和
    if…fi
    块移动到一个单独的脚本中,然后将其称为
    find…|xargs/path/to/myMavenFinder.sh
    。祝你好运。我理解你在说什么,我会尝试一下,谢谢你。但我正在尝试编写一个脚本来完成所有这些。顺便说一句,优秀的第一篇文章+1,tha不包括示例输入、所需输出和gasp,试图解决您的问题。继续发帖,祝您好运!谢谢dogbane,我刚刚修改了帖子并删除了if函数,因为我真的不需要显示超出范围的POM。无论如何,您的版本看起来更好,我将与您的帖子一起玩,看看我能从中得到什么。
    #!/bin/bash
    check()
    {
    echo -e 'setns x=http://maven.apache.org/POM/4.0.0\ncat /x:project/x:parent/x:version/text()' | xmllint --shell pom.xml | grep -v /
    }
    
    find . -type f -name pom.xml | xargs grep 'Maven_CAS_Parent\|Maven_JAB_Parent' | Check
    
    while IFS= read -r file
    do
        artifactId=$(xmllint --format --shell "$file" <<< "cat //parent/artifactId/text()" | grep -v /)
        if [[ $artifactId =~ ^(Maven_CAS_Parent|Maven_JAB_Parent)$ ]]
        then
            version=$(xmllint --format --shell "$file" <<< "cat //parent/version/text()" | grep -v /)
        else
            artifactId="Out of scope"
            version=""
        fi
        echo "$file $artifactId $version"    
    done < <(find . -type f -name "pom.xml")