我有一个这样的数据文件:
<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 是一个稍微修改过的文档,它<root>
在开始处添加了一个标记,</root>
在末尾添加了一个结束标记,只是为了使其成为格式良好的 XML 文档。
答案2
查看 usling xslt 脚本来转换或解析您的 XML,xsltproc 是您正在寻找的二进制文件,w3cschools 有一个很好的入门指南。
答案3
awk
解决方案。
$ awk -F= '/name="rsv-group-name"/{g=$NF}/data="name4"/{print substr(g,2,length(g)-5)}' inputfile