我当前正在使用sed脚本:
cd(根文件夹)优先
find . -name pom.xml | xargs sed -i "/<dependencies>/,/'<\/dependencies>'/s/-SNAPSHOT//"
当前,此脚本在标记下删除-SNAPSHOT所有pom.xml包含其子文件夹的文件夹上的,<dependencies></dependencies>xml的示例为:
-SNAPSHOT
pom.xml
<dependencies></dependencies>
<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将被删除。
artifactID - scheduler-service- core
不要尝试使用来编辑XML sed,它不是针对这种结构化数据而设计的。sed当有人在您原本不希望的空白处插入良性空格时,编辑XML的脚本总是会崩溃,而没有编辑XML的人则希望由于布局更改而导致损坏。
sed
相反,我将使用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包含上面的样式表。