Sed
刪除 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 發表評論後,我搜尋了此規則的一個例外,並將其作為最後一部分添加到上述範例中。
像你想要這樣的接縫:
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 行 只保留每個版本的第一行