n+2行に特定の文字列が含まれていない場合に一致する文字列を置き換える方法

n+2行に特定の文字列が含まれていない場合に一致する文字列を置き換える方法
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.icc.id</groupId>
        <artifactId>idp-parent</artifactId>
        <version>7.0.1.0-SNAPSHOT</version>
        <relativePath>../../pom.xml</relativePath>
    </parent>

    <artifactId>app</artifactId>
    <packaging>war</packaging>
    <name>${project.name} - Hello World Web App</name>

    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
        </dependency>
        <dependency>
            <groupId>com.icc.id</groupId>
            <artifactId>solution-commons</artifactId>
            <version>${com.icc.id.version}</version>
        </dependency>
        <dependency>
            <groupId>com.icc.id</groupId>
            <artifactId>application-common</artifactId>
            <version>${com.icc.version}</version>
        </dependency>
        <dependency>
            <groupId>com.icc.id</groupId>
            <artifactId>framework-commons-hazelcast</artifactId>
            <version>${com.icc.version}</version>
        </dependency>
        <dependency>
            <groupId>com.icc.id</groupId>
            <artifactId>framework-commons-health</artifactId>
            <version>${com.icc.version}</version>
        </dependency>
        <dependency>
            <groupId>com.icc.id</groupId>
            <artifactId>framework-commons-rabbitmq</artifactId>
            <version>${com.icc.version}</version>
        </dependency>
        <dependency>
            <groupId>com.icc.id</groupId>
            <artifactId>framework-commons-rest</artifactId>
            <version>${com.icc.version}</version>
        </dependency>
        <dependency>
            <groupId>com.icc.id</groupId>
            <artifactId>framework-commons-security</artifactId>
            <version>${com.icc.version}</version>
        </dependency>
        <dependency>
            <groupId>com.icc.id</groupId>
            <artifactId>framework-commons-system</artifactId>
            <version>${com.icc.version}</version>
        </dependency>
        <dependency>
            <groupId>com.icc.id</groupId>
            <artifactId>framework-commons-web</artifactId>
            <version>${com.icc.version}</version>
        </dependency>
        <dependency>
            <groupId>com.icc.id</groupId>
            <artifactId>platform-connector-cache</artifactId>
            <version>${com.icc.version}</version>
        </dependency>
        <dependency>
            <groupId>com.icc.id</groupId>
            <artifactId>platform-connector-spring-remoting</artifactId>
            <version>${com.icc.version}</version>
        </dependency>
        <dependency>
            <groupId>com.icc.id</groupId>
            <artifactId>platform-openid-connect</artifactId>
            <version>${com.icc.version}</version>
        </dependency>
        <dependency>
            <groupId>com.icc.id</groupId>
            <artifactId>platform-rest-commons</artifactId>
            <version>${com.icc.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- The following log4j 1.2 bridge is needed to satisfy libraries that has runtime dependency on log4j 1.2. -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-1.2-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-tools</artifactId>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>
        <dependency>

</project>

したがって、pom.xmlは次のようになります。したがって、要件は各行をスキャンしてcom.icc.idを検索することです。見つかった場合は、行n + 2にcom.icc.id.versionが含まれていない場合にのみ置換を実行する必要があります(バージョン行にcom.icc.idが含まれています)。バージョン) 。 com.icc.id.versionが含まれていない場合は、groupidをcom.uxpsystems.$1に置き換える必要があります(ここで$ 1はこのスクリプトに引数として渡されます)。その場合は、ブロックをスキップし、次の行にcomが含まれていることを確認してください。 .icc.ID

ベストアンサー1

$1sedコマンドのrhsにデータ(を介して)を注入するため、s///sedコードに挿入されたときにエラーが発生しないように正しく引用する必要があります。

注:すでに指摘したように、この問題を解決する正しい方法はxmlツールを使用することです。

$ v1_esc=$(printf '%s\n' "$1" | sed -e 's:[\/&]:\\&:g;$!s/$/\\/')
$ sed -e '
   /com[.]icc[.]id/!b
   $!N;$!N;/\n.*\n/!q
   /.*\n.*\n.*com[.]icc[.]id[.]version/b
   '"s/com[.]icc[.]id\\(.*\\n.*\\n\\)/com.uxpsystems.${var}\\1/"'
' pom.xml

説明する:

  • 退屈な行をスキップしてそのまま印刷してください。
  • 3つの行をつかみ、興味のある行から世紀を始めましょう。
  • 3行をインポートするプロセスでは、すべての行が使用されます。これはeofに達してから終了し、パターンスペースをそのまま印刷することを意味します。
  • ここまで来たらパターン空間に見てみるラインが3本あるという意味でsed、そのうち最初のラインが興味深いラインです。
  • 3行目に指定された文字列com.icc.id.versionがない場合、3行のブロック処理はスキップされ、そのまま印刷されます。
  • ここで意味するのは、最終的に正しい3行ブロックが検出され、必要な代替操作を実行する必要があることです。

おすすめ記事