Procura todos os arquivos xml recursivamente no diretório de uma tag específica e usa o valor da tag

2

Precisa fazer exatamente o que foi perguntado. Ubuntu 14.04 Trusty Tahr.

Suponha que eu tenha um diretório chamado 'testmag', que pode conter 100s de arquivos xml e diretórios que, por sua vez, contêm muitos arquivos xml também. Não sei nomes de nenhum arquivo xml, mas sei que 1 deles contém a tag <dbname>....</dbname> .

Agora, como encontrar o arquivo que contém a tag mencionada acima e exibir o valor da tag como saída no terminal

    
por Vicky Dev 21.10.2016 / 12:53

3 respostas

3

Aqui está uma solução com find que também exibirá os nomes dos arquivos contendo uma correspondência:

find . -name "*.xml" -exec grep '<dbname>' {} \;             \
                     -exec echo -e {}"\n" \;                 \
                     | sed 's/<dbname>\(.*\)<\/dbname>//g'

Explicação

  1. find . -name "*.xml" localiza todos os arquivos xml recursivamente a partir do diretório atual
  2. -exec grep '<dbname>' {} \; em cada pesquisa de arquivo para o padrão <dbname>
  3. -exec echo -e {}"\n" \; echo filename + nova linha ( -e opção faz o echo interpretar \n )
  4. | sed 's/<dbname>\(.*\)<\/dbname>//g' saída de canal para sed para imprimir apenas o campo contido entre as tags <dbname></dbname> .

NOTA 1: você pode formatar a saída em echo -e ... para ter resultados para cada arquivo claramente definidos, por exemplo, adicionando novas linhas ou linhas de sublinhado, o que for mais adequado à sua necessidade.

NOTA2: o caminho para cada arquivo será dado em relação a . (por exemplo, ./subfolder1/file.xml ). Se você quiser um caminho absoluto, vá para find $PWD -name ... .

    
por 21.10.2016 / 14:25
1

Suponha que tenhamos o diretório XMLS contendo esses arquivos:

cat XMLS/file1
foo bar <dbname>target</dbname> baz
foo foo

cat XMLS/file2
<name>notarget</name>

Eu usaria este comando:

grep -r '<dbname>' XMLS/ | sed 's/.*<dbname>\(.*\)<\/dbname>.*//'
target

Como você pode ver, retorna o valor dentro das tags <dbname> . E não o valor dentro das tags <name> .


O sinal -r para grep pesquisa recursivamente.

sed retira a string de tudo, exceto o valor target .

    
por 21.10.2016 / 13:07
0

Usando um analisador XML adequado para analisar XML:

shopt -s globstar nullglob
for file in **/*.xml; do 
    dbname=$(xmlstarlet sel -t -v '//dbname' "$file")
    [[ -n "$dbname" ]] && printf "%s\t%s\n" "$file" "$dbname"
done
    
por 21.10.2016 / 16:37