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.아이디

답변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, 그 중 첫 번째 라인이 흥미로운 라인입니다.
  • 세 번째 줄에 지정된 문자열 com.icc.id.version이 없으면 3줄 블록 처리를 건너뛰고 그대로 인쇄됩니다.
  • 여기서 의미하는 바는 마침내 올바른 3줄 블록이 감지되었으며 이제 필요한 대체 작업을 수행해야 한다는 것입니다.

답변2

이것은 간단해 보인다 xmlstarlet:

#!/bin/sh

xmlstarlet ed -N ns="http://maven.apache.org/POM/4.0.0" -u \
    '//ns:dependency[ns:groupId = "com.icc.id" and not(ns:version = "${com.icc.version}")]/ns:version' \
    -v "com.uxpsystems.$1" file.xml

version이렇게 하면 텍스트가 있는 노드가 있는 노드의 하위 노드를 제외하고 텍스트가 있는 모든 노드가 선택됩니다 ${com.icc.version}. 선택한 노드는 모두 업데이트되어 스크립트에 제공되는 첫 번째 인수인 text 를 포함합니다.dependencygroupIDcom.icc.idversioncom.uxpsystems.$1$1

답변3

파싱하거나 다음과 같이 라인을 버퍼에 로드합니다.

awk '{line=line1;
      line1=line2;
      line2=$0;}
     /com.icc.id.version/ { if (line ~ "com.icc.id")
       { line = ... replace ... }
     }
     {print line}
     END {print line1; print line}'

참고: 테스트하지는 않았지만 꽤 비슷할 것입니다.

관련 정보