Исключения sed / if else условие удаления слова в xml - PullRequest
0 голосов
/ 31 мая 2018

В настоящее время я использую сценарий sed:

cd (корневая папка) сначала

find . -name pom.xml | xargs sed -i "/<dependencies>/,/'<\/dependencies>'/s/-SNAPSHOT//"

В настоящее время этот сценарий удаляет -SNAPSHOT на всех pom.xml в папке, включаяего подпапки под тегом <dependencies></dependencies>, пример xml:

 <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>

, так что теперь мне нужно исключить те теги, которые имеют слово «ядро планировщика-службы» или в основном планировщик, какМне не нужно анализировать это, но мой скрипт удаляет его, потому что он находится под тегами зависимостей. Как я могу иметь исключение для этого?слова «планировщик» будут меняться, потому что я буду использовать это в разных сервисах, поэтому сценарий должен полагаться на исключение из слова, так как я изменю его при использовании для разных сервисов.

желаемый результат должен быть:

 <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>

, если вы видите, -SNAPSHOT для artifactID - scheduler-service-core был сохранен, и все другие зависимости, ниже которых есть -SNAPSHOT, будут удалены,

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Используя XSLT технологии:

СТИЛЬ:

$ more pomConvertor.xslt 
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes" />
    <xsl:strip-space elements="*"/>

    <!-- default behavior is to copy everything nodes and attribute-->
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

<!-- when you reach version node under dependency for which the artifactId does contain scheduler you copy the string before -SNAPSHOT -->
    <xsl:template match="//dependencies/dependency/version[not(contains(../artifactId/text(),'scheduler'))]">
        <version><xsl:value-of select="substring-before(text(),'-')"/></version>
    </xsl:template>

</xsl:stylesheet>

ВХОД:

$ more pom.xml 
<pom>
 <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>
</dependencies>
</pom>

ВЫХОД:

$ xsltproc pomConvertor.xslt pom.xml                                                                                             
<?xml version="1.0"?>
<pom>
  <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>
  </dependencies>
</pom>
0 голосов
/ 31 мая 2018

Не пытайтесь редактировать XML с помощью sed, он не предназначен для такого рода структурированных данных.sed скрипты, которые редактируют XML, всегда ломаются, когда кто-то вставляет доброкачественные пробелы в то место, о котором вы их изначально не ожидали, и никто, кто редактирует XML, не ожидает, что что-то сломается из-за изменений макета.

Вместо этого я бы использовал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 содержит вышеуказанноетаблица стилей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...