Procure usar scripts xslt para transformar ou analisar seu XML, xsltproc é o binário que você está procurando e w3cschools tem um bom guia para começar.
Eu tenho um arquivo de dados como este:
<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>
Eu sei o nome de login do registro que quero e preciso combiná-lo com um grupo. Digamos que eu queira saber qual grupo name3
é (a resposta é group 3
). Atualmente posso tirar o nome do grupo do arquivo com:
perl -ne 'print "$_\n" foreach /name="rsv-group-name".*\ data="([^"]*)"/g;'
mas não tenho ideia de como combiná-lo com um usuário. Como posso fazer isso em um script?
Procure usar scripts xslt para transformar ou analisar seu XML, xsltproc é o binário que você está procurando e w3cschools tem um bom guia para começar.
O grupo é group 2
, não 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
group 2
A consulta XPATH procura um Key/Key/Value
nó que tenha name="rsv-login-name"
e data="name3"
, e para o Key
que esse nó é um Key/Value
do nó, ele retorna o atributo data
para o Value
node que tem name="rsv-group-name"
.
O XML que usei aqui é um documento ligeiramente modificado que adiciona uma tag <root>
no início e uma tag </root>
end no final, apenas para torná-lo um documento XML bem formado.
awk
solution.
$ awk -F= '/name="rsv-group-name"/{g=$NF}/data="name4"/{print substr(g,2,length(g)-5)}' inputfile
Tags perl xml regular-expression