다음과 같은 데이터 파일이 있습니다.
<Key name="com.ahsay.afc.cpf.UserGroup" content="" allowMultiple="Y">
<Value name="rsv-id" inheritParentAttribute="Y" type="string" data="1328200856753" />
<Value name="rsv-group-name" inheritParentAttribute="Y" type="string" data="group 1" />
<Value name="rsv-user-type" inheritParentAttribute="Y" type="string" data="backup-user" />
<Value name="rsv-owner" inheritParentAttribute="Y" type="string" data="" />
<Key name="com.ahsay.afc.cpf.User" content="" allowMultiple="Y">
<Value name="rsv-id" inheritParentAttribute="Y" type="string" data="13279083887401" />
<Value name="rsv-login-name" inheritParentAttribute="Y" type="string" data="name1" />
</Key>
<Key name="com.ahsay.afc.cpf.User" content="" allowMultiple="Y">
<Value name="rsv-id" inheritParentAttribute="Y" type="string" data="13279083887401" />
<Value name="rsv-login-name" inheritParentAttribute="Y" type="string" data="name2" />
</Key>
</Key>
<Key name="com.ahsay.afc.cpf.UserGroup" content="" allowMultiple="Y">
<Value name="rsv-id" inheritParentAttribute="Y" type="string" data="1328200856753" />
<Value name="rsv-group-name" inheritParentAttribute="Y" type="string" data="group 2" />
<Value name="rsv-user-type" inheritParentAttribute="Y" type="string" data="backup-user" />
<Value name="rsv-owner" inheritParentAttribute="Y" type="string" data="" />
<Key name="com.ahsay.afc.cpf.User" content="" allowMultiple="Y">
<Value name="rsv-id" inheritParentAttribute="Y" type="string" data="13279083887401" />
<Value name="rsv-login-name" inheritParentAttribute="Y" type="string" data="name3" />
</Key>
<Key name="com.ahsay.afc.cpf.User" content="" allowMultiple="Y">
<Value name="rsv-id" inheritParentAttribute="Y" type="string" data="13279083887401" />
<Value name="rsv-login-name" inheritParentAttribute="Y" type="string" data="name4" />
</Key>
</Key>
원하는 레코드의 로그인 이름을 알고 있으며 이를 그룹과 일치시켜야 합니다. 그룹이 무엇인지 알고 싶다고 가정해 보겠습니다 name3
(답은 입니다 group 3
). 현재 다음을 통해 파일에서 그룹 이름을 얻을 수 있습니다.
perl -ne 'print "$_\n" foreach /name="rsv-group-name".*\ data="([^"]*)"/g;'
하지만 사용자와 어떻게 일치시킬 수 있는지 모르겠습니다. 스크립트에서 이 작업을 어떻게 수행할 수 있나요?
답변1
group 2
대신 그룹은 다음과 같습니다 group 3
.
xmlstarlet sel -t \
-v '//Key[Key/Value[@name="rsv-login-name" and @data="name3"]]/Value[@name="rsv-group-name"]/@data' -nl file.xml
또는 명령줄에서 얻은 쿼리 값을 사용하세요.
xmlstarlet sel -t --var data="'name3'" \
-v '//Key[Key/Value[@name="rsv-login-name" and @data=$data]]/Value[@name="rsv-group-name"]/@data' -nl file.xml
또는,
xmlstarlet sel -t --var data="'name3'" \
-m '//Key/Key/Value[@name="rsv-login-name" and @data=$data]' \
-v '../../Value[@name="rsv-group-name"]/@data' -nl file.xml
이들 중 하나의 출력은 입니다 group 2
.
XPath 쿼리는 Key/Key/Value
및 가 있는 노드를 찾고 해당 노드가 노드인 경우 가 있는 노드의 속성을 반환합니다.name="rsv-login-name"
data="name3"
Key
Key/Value
data
Value
name="rsv-group-name"
여기서 사용하고 있는 XML은 올바른 형식의 XML 문서를 만들기 위해 <root>
시작 부분에 태그를 추가하고 끝 부분에 닫는 태그를 추가하는 약간 수정된 문서입니다.</root>
답변2
XML을 변환하거나 구문 분석하려면 usling xslt 스크립트를 확인하세요. xsltproc는 여러분이 찾고 있는 바이너리이며, w3cschools는 시작하기 좋은 가이드를 제공합니다.
답변3
awk
해결책.
$ awk -F= '/name="rsv-group-name"/{g=$NF}/data="name4"/{print substr(g,2,length(g)-5)}' inputfile