O Perl tem um "modo de parágrafo" bacana ( -00
) onde os registros ("linhas") são separados por uma linha em branco em vez de um único caractere \n
. Usando isso, você pode facilmente extrair os registros relevantes. Portanto, primeiro certifique-se de que há uma linha em branco antes de cada <block>
e, em seguida, use o modo de parágrafo para encontrar o que você está procurando:
$ sed 's/<block>/\n<block>/' file | perl -00ne 'if(/<name>\s*bob\s*<\/name>/i){print}'
<block>
<name>Bob</name>
<address>USA</address>
<email>[email protected]</email>
<phone>1234567</phone>
</block>
Agora, coloque isso em um script de shell (usando o bash aqui):
#!/bin/ksh
## Read the search strings
tag="$1"
value="$2"
target="file.xml" ## change this to whatever your xml file is called
## Search
sed 's/<.\?block>/\n/' "$target" |
perl -00ne "if(/<$tag>\s*$value\s*<\/$tag>/i){
## May as well do the formatting in Perl as well
s# *<([^/]+?)>#=#g;
s/<\/.+?>//g;
print
}"
Em seguida, execute o script fornecendo o nome da tag e o valor desejado como entrada:
$ a.sh "name" "bob"
name=Bob
address=USA
[email protected]
phone=1234567