Usando Bash,
Arquivo:
<?xml version="1.0" encoding="UTF-8"?>
<blah>
<blah1 path="er" name="andy" remote="origin" branch="master" tag="true" />
<blah1 path="er/er1" name="Roger" remote="origin" branch="childbranch" tag="true" />
<blah1 path="er/er2" name="Steven" remote="origin" branch="master" tag="true" />
</blah>
Eu tentei o seguinte:
grep -i 'name="andy" remote="origin" branch=".*\"' <filename>
Mas ele retorna a linha inteira:
<blah1 path="er" name="andy" remote="origin" branch="master" tag="true" />
Eu gostaria de combinar a linha com base no seguinte:
name="andy"
Eu só quero que ele retorne:
master
Use um analisador XML para analisar dados XML. Com xmlstarlet , torna-se apenas um exercício XPath:
Com
grep
:-P
habilitar expressões regulares perl (PCRE)-i
ignorar caso-o
imprimir apenas peças correspondentesNa regex, o
\K
é um lookbehind de largura zero para corresponder à parte antes do\K
, mas não para incluí-lo na correspondência.Use xmllint para extrair o valor do atributo usando XPath:
É melhor usar um analisador XML para processar XML, pois a ordem dos atributos pode mudar e as quebras de linha podem ser inseridas, resultando em atributos de nome e ramificação em diferentes linhas do arquivo.
Usando
awk
:Isso encontrará uma linha contendo
name="andy"
e, em seguida, percorrerá cada campo nessa linha. Se o campo contiverbranch=
, removeremosbranch=
todas as aspas duplas e imprimiremos o restante do campo.sub(/branch=/, "")
está procurando uma correspondênciabranch=
e substituindo-a por""
(nada)gsub é semelhante, exceto que substituirá globalmente (todas as ocorrências em vez de apenas a primeira ocorrência).
Eu acho que isso funciona:
A
awk
parte garante que apenasbranch="master"
seja retornado, ased
parte devolve o que está entre aspas duplas com uma referência (a\1
correspondência com a parte entre os parênteses).Agora eu sei que há muitas pessoas por aqui com muito mais conhecimento sobre a arte que é awk e sed, então estou preparado para algumas críticas :-)
Se você não tiver acesso a xmllint ou xmlstarlet em sua máquina. Certifique-se de transformar seu xml em uma linha antes de usar grep assim
agora você tem certeza de que as tags não estão divididas em linhas separadas
será cortado (como em xpath /blah1[@name="andy"])
agora
retornará (como em xpath /@branch)
mestre
todos juntos