<?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
$1
sed 명령의 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 를 포함합니다.dependency
groupID
com.icc.id
version
com.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}'
참고: 테스트하지는 않았지만 꽤 비슷할 것입니다.