在xml上删除单词的sed exceptions / if else条件

时间:2018-05-31 02:56:02

标签: xml linux shell jenkins sed

我目前正在使用sed脚本:

cd(根文件夹)首先

find . -name pom.xml | xargs sed -i "/<dependencies>/,/'<\/dependencies>'/s/-SNAPSHOT//"

目前,此脚本会删除标记为-SNAPSHOT下文件夹(包括其子文件夹)上所有pom.xml的{​​{1}}, xml的例子是:

<dependencies></dependencies>

所以现在,我需要的是排除那些带有“scheduler-service-core”或基本上是调度程序的标记,因为我不需要解析它,但是我的脚本正在删除它,因为它在依赖项标记下,如何我可以排除这个吗?单词“scheduler”将会改变,因为我将在不同的服务上使用它,所以脚本应该依赖于单词的排除,因为我将在使用不同的服务时更改它。

期望的输出应该是:

 <parent>
    <groupId>com.techstack.scheduler</groupId>
    <artifactId>scheduler-service</artifactId>
    <version>0.0.9-SNAPSHOT</version>
 </parent>

    <artifactId>scheduler-webapp</artifactId>
    <packaging>war</packaging>
    <name>Scheduler Service Web Application</name>
    <url>http://maven.apache.org</url>

<dependencies>
    <dependency>
        <groupId>com.infor.techstack.scheduler</groupId>
        <artifactId>scheduler-service-core</artifactId>
        <version>0.0.9-SNAPSHOT</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.12-SNAPSHOT</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.security.authentication</groupId>
        <artifactId>oauth10a-client</artifactId>
        <version>0.0.26-SNAPSHOT</version>
        <scope>compile</scope>
        <exclusions>
            <exclusion>
                <artifactId>xerces</artifactId>
                <groupId>xerces</groupId>
            </exclusion>
        </exclusions>
 </dependency>

如果可以看到, <parent> <groupId>com.techstack.scheduler</groupId> <artifactId>scheduler-service</artifactId> <version>0.0.9-SNAPSHOT</version> </parent> <artifactId>scheduler-webapp</artifactId> <packaging>war</packaging> <name>Scheduler Service Web Application</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>com.infor.techstack.scheduler</groupId> <artifactId>scheduler-service-core</artifactId> <version>0.0.9-SNAPSHOT</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.12</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.security.authentication</groupId> <artifactId>oauth10a-client</artifactId> <version>0.0.26</version> <scope>compile</scope> <exclusions> <exclusion> <artifactId>xerces</artifactId> <groupId>xerces</groupId> </exclusion> </exclusions> </dependency> -SNAPSHOT已被保留,其下所有其他依赖项artifactID - scheduler-service-core将被删除。

2 个答案:

答案 0 :(得分:2)

不要尝试使用sed编辑XML,而不是针对此类结构化数据。编辑XML的sed脚本总是在有人插入你原本没想到的好空格时崩溃,编辑XML的人不会因为布局的变化而破坏。

相反,我会使用XSLT:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <!-- Identity template: just copy everything -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- special rule for version tags that include -SNAPSHOT and whose
       parent tag has an artifactId subtag that contains scheduler-service -->
  <xsl:template match="//version[contains(., '-SNAPSHOT') and not(contains(../artifactId, 'scheduler-service'))]">
    <xsl:copy>
      <!-- copy attributes -->
      <xsl:apply-templates select="@*"/>
      <!-- and only use the part of the node content before -SNAPSHOT -->
      <xsl:value-of select="substring-before(., '-SNAPSHOT')"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

现在你可以使用例如。

xsltproc foobar.xsl pom.xml

xalan -in pom.xml -xsl foobar.xsl

取决于您喜欢的XSLT处理器,foobar.xsl包含上述样式表。

答案 1 :(得分:0)

使用XSLT技术:

STYLESHEET:

$ more pomConvertor.xslt 
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes" />
    <xsl:strip-space elements="*"/>

    <!-- default behavior is to copy everything nodes and attribute-->
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

<!-- when you reach version node under dependency for which the artifactId does contain scheduler you copy the string before -SNAPSHOT -->
    <xsl:template match="//dependencies/dependency/version[not(contains(../artifactId/text(),'scheduler'))]">
        <version><xsl:value-of select="substring-before(text(),'-')"/></version>
    </xsl:template>

</xsl:stylesheet>

<强> INPUT:

$ more pom.xml 
<pom>
 <parent>
    <groupId>com.techstack.scheduler</groupId>
    <artifactId>scheduler-service</artifactId>
    <version>0.0.9-SNAPSHOT</version>
 </parent>

    <artifactId>scheduler-webapp</artifactId>
    <packaging>war</packaging>
    <name>Scheduler Service Web Application</name>
    <url>http://maven.apache.org</url>

<dependencies>
    <dependency>
        <groupId>com.infor.techstack.scheduler</groupId>
        <artifactId>scheduler-service-core</artifactId>
        <version>0.0.9-SNAPSHOT</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.12-SNAPSHOT</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.security.authentication</groupId>
        <artifactId>oauth10a-client</artifactId>
        <version>0.0.26-SNAPSHOT</version>
        <scope>compile</scope>
        <exclusions>
            <exclusion>
                <artifactId>xerces</artifactId>
                <groupId>xerces</groupId>
            </exclusion>
        </exclusions>
        </dependency>
</dependencies>
</pom>

<强>输出:

$ xsltproc pomConvertor.xslt pom.xml                                                                                             
<?xml version="1.0"?>
<pom>
  <parent>
    <groupId>com.techstack.scheduler</groupId>
    <artifactId>scheduler-service</artifactId>
    <version>0.0.9-SNAPSHOT</version>
  </parent>
  <artifactId>scheduler-webapp</artifactId>
  <packaging>war</packaging>
  <name>Scheduler Service Web Application</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>com.infor.techstack.scheduler</groupId>
      <artifactId>scheduler-service-core</artifactId>
      <version>0.0.9-SNAPSHOT</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.12</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>com.security.authentication</groupId>
      <artifactId>oauth10a-client</artifactId>
      <version>0.0.26</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>
          <artifactId>xerces</artifactId>
          <groupId>xerces</groupId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>
</pom>