sed异常/如果删除XML上的单词,则为其他条件

我当前正在使用sed脚本:

cd(根文件夹)优先

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

当前,此脚本在标记下删除-SNAPSHOT所有pom.xml包含其子文件夹的文件夹上的,<dependencies></dependencies>xml的示例为:

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

所以现在,我需要排除那些带有“ 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</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>

如果您看到了,则-SNAPSHOTfor artifactID - scheduler-service-

core保留,其余的所有依赖项-SNAPSHOT将被删除。

回答:

不要尝试使用来编辑XML

sed,它不是针对这种结构化数据而设计的。sed当有人在您原本不希望的空白处插入良性空格时,编辑XML的脚本总是会崩溃,而没有编辑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包含上面的样式表。

以上是 sed异常/如果删除XML上的单词,则为其他条件 的全部内容, 来源链接: utcz.com/qa/399880.html

回到顶部