问题
我有一个来自 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号线 只保留每个版本的第一行