我目前正在使用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
将被删除。
答案 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>