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호선 각 버전의 첫 번째 줄만 유지

관련 정보