用于删除 pom.xml 中除编号最高的模块之外的所有模块的脚本

用于删除 pom.xml 中除编号最高的模块之外的所有模块的脚本

问题

我有一个来自 Talend DI/ESB 项目的巨大 pom.xml,其中可以为具有不同 Talend 特定版本的同一模块设置多行(甚至不需要这样 :-( )

因此,我想清理 pom.xml,以便删除除末尾编号最高的模块之外的所有模块行。在我的示例中,该行与

工作/路线/specialbookings_0.7

应保留,同一模块的所有其他模块行应删除。问题是,对于前而言。 0.10 在数值上小于 0.9。

我不是正则表达式专业人士,但我认为使用 sed 是一个好方法?!

先感谢您。

pom.xml 的示例部分

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>de.example.com</groupId>
  <artifactId>code.Master</artifactId>
  <version>1.0.0</version>
  <packaging>pom</packaging>
  <name>Codes Master</name>
  <url>http://www.example.com/</url>
  <modules>
    ...
    <module>jobs/routes/reservation_0.5</module>
    <module>jobs/routes/reservation_0.9</module>
    <module>jobs/routes/reservation_0.10</module>
    <module>jobs/routes/reservation_0.11</module>
    <module>jobs/routes/reservation_1.0</module>
    <module>jobs/routes/reservation_1.10</module>
    <module>jobs/routes/reservation_1.11</module>
    ...
    <module>jobs/routes/specialbookings_0.1</module>
    <module>jobs/routes/specialbookings_0.2</module>
    <module>jobs/routes/specialbookings_0.3</module>
    <module>jobs/routes/specialbookings_0.4</module>
    <module>jobs/routes/specialbookings_0.5</module>
    <module>jobs/routes/specialbookings_0.6</module>
    <module>jobs/routes/specialbookings_0.7</module>
    ...
    <module>jobs/routes/employee_0.1</module>
    <module>jobs/routes/employee_0.2</module>
    <module>jobs/routes/employee_0.3</module>
    <module>jobs/routes/employee_1.0</module>
    <module>jobs/routes/employee_1.1</module>
    <module>jobs/routes/employee_1.10</module>
    <module>jobs/routes/employee_1.2</module>
    <module>jobs/routes/employee_1.3</module>
    <module>jobs/routes/employee_1.4</module>
    <module>jobs/routes/employee_1.5</module>
    <module>jobs/routes/employee_1.6</module>
    <module>jobs/routes/employee_1.7</module>
    <module>jobs/routes/employee_1.8</module>
    <module>jobs/routes/employee_1.9</module>
    <module>jobs/routes/employee_2.0</module>
    <module>jobs/routes/employee_2.1</module>
    <module>jobs/routes/employee_2.2</module>

    <module>jobs/routes/article2erpmodel_0.1</module>
    <module>jobs/routes/article2erpmodel_0.10</module>
    <module>jobs/routes/article2erpmodel_0.11</module>
    <module>jobs/routes/article2erpmodel_0.12</module>
    <module>jobs/routes/article2erpmodel_0.13</module>
    <module>jobs/routes/article2erpmodel_0.14</module>
    <module>jobs/routes/article2erpmodel_0.15</module>
    <module>jobs/routes/article2erpmodel_0.16</module>
    <module>jobs/routes/article2erpmodel_0.17</module>
    <module>jobs/routes/article2erpmodel_0.18</module>
    <module>jobs/routes/article2erpmodel_0.19</module>
    <module>jobs/routes/article2erpmodel_0.2</module>
    <module>jobs/routes/article2erpmodel_0.20</module>
    <module>jobs/routes/article2erpmodel_0.3</module>
    <module>jobs/routes/article2erpmodel_0.4</module>
    <module>jobs/routes/article2erpmodel_0.5</module>
    <module>jobs/routes/article2erpmodel_0.6</module>
    <module>jobs/routes/article2erpmodel_0.7</module>
    <module>jobs/routes/article2erpmodel_0.8</module>
    <module>jobs/routes/article2erpmodel_0.9</module>
  </modules>
</project>

更新

在 @RomanPerekhrest 发表评论后,我搜索了此规则的例外情况,并将其添加为上面示例的最后一部分。

答案1

接缝就像你想要这样的东西:

vim -c:1 -c'/<modules>' -c+1 -c':mark q' \
   -c'/<.modules>' -c-1 -c':mark w' \
   -c "'q,'w"'!sort -rV | sort -t_ -k1,1 -u' pom.xml

从脚本运行它并不完全安全,它包含一些假设。其中一些是

  • 每个模块名称在版本号之前都包含一个下划线
  • xml 的格式如上所示,模块和模块标记位于不同的行中,等等。如果不是这种情况,您必须首先使用一些更漂亮的 xml。

分解命令:

  • 1号线 为了确定起见,转到文件开头,用 q 标记第一个模块
  • 2号线 用 w 标记最后一个模块
  • 3号线 按模块名称和版本号反向排序
  • 3号线 只保留每个版本的第一行

相关内容