2017-03-16 1 views
2

link을 기반으로 비슷한 문제를 해결하려고합니다.xmlstarlet 조건에 따른 값 선택

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.foo</groupId> 
    <artifactId>iwidget</artifactId> 
    <packaging>jar</packaging> 
    <version>0.9.1b</version> 
    <name>iwidget</name> 
    <url>http://maven.apache.org</url> 

    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    </dependencies> 
</project> 

나는 iwidget로 동일한 groupIdartifactId 경우 추출 할. 내가 지금까지 시도 무엇

: 내가 놓친 게 무엇

xmlstarlet sel -N x=http://maven.apache.org/POM/4.0.0 -t -v "/x:project/x:groupId" < pom.xml 

위가의 groupId = foo.bar 반환은, 그러나, 나는 그것이 artifactIdiwidget

$VAR='foo.bar' 
xmlstarlet sel -N x=http://maven.apache.org/POM/4.0.0 -t -m "//x:project[artifactId="$VAR"]" -v "//x:project/groupId" < pom.xml 

동일한 경우에만 반환하려면 ? 첫 번째 명령에

답변

1

건물, 당신은 artifactId 요소의 값을 필터링 할 project에 간단한 XPath를 술어를 적용 할 수 있어야한다 :

xmlstarlet sel -N x=http://maven.apache.org/POM/4.0.0 -t \ 
    -v "/x:project[x:artifactId='iwidget']/x:groupId" < pom.xml 

변수의 사용에 관해서는, 당신은 따옴표로 포장 할 필요가 값은 XPath 프로세서에서 문자열 리터럴로 인식됩니다.

xmlstarlet sel -N x=http://maven.apache.org/POM/4.0.0 -t \ 
    -v "/x:project[x:artifactId='$VAR']/x:groupId" < pom.xml 
+0

위의 pom은 제공되지 않습니다. 'iwidget'대신 쉘 변수 $ var를 사용할 수 있습니까? 그러나 변수가 없어도 작동하지 않습니다. – askb

+0

포스트에서 XML을 업데이트하여 올바른 형식으로 만들었습니다. 그 정확한 * XML로 위의 명령을 시도해 볼 수 있습니까? 나는 그것을 여기에서 시험해 보았다. (xmlstarlet on docker 우분투 16.04). – har07

+0

내가 찾고있는 것은 "iwidget"의 쉘 변수 ($ VAR)를 사용하고있다. 이 작업은 문자열을 직접 전달할 때 작동하며 $ VAR을 전달하면 아무 것도 반환하지 않습니다. – askb