No bash, alimenta a saída de um comando linha por linha em outro comando

5

Eu tenho o seguinte comando bash, que busca e bloqueia o XML de uma única coluna no mysql e o alimenta no xmllint para purificá-lo.

mysql --format csv --skip-column-names -e "select xmldata from mytable limit 1;" | xmllint --format -

Até aí tudo bem, mas funciona apenas para uma linha de cada vez. Eu gostaria de adaptar isso para que cada linha na saída da consulta SQL seja alimentada em uma chamada separada para xmlint.

Eu sei que isso pode ser feito com um loop em um script bash - mas eu gostaria de fazê-lo em um one-liner, se possível. Supostamente isso pode ser feito com xargs, mas não consigo descobrir.

    
por frankadelic 08.02.2012 / 22:46

2 respostas

6
mysql --format csv --skip-column-names \
    -e "select xmldata from mytable limit 1;" \
    | while IFS= read -r line; do xmllint --format - <<<"$line"; done

Dividir para facilitar a leitura, obviamente você não precisa. O <<<$line é um herestring , que alimenta o conteúdo de $line a xmllint como stdin.

    
por 08.02.2012 / 23:05
0

Isso é possível com xargs , mas xargs passaria cada linha como um argumento para xmllint , não para sua entrada padrão. Você precisaria ter xargs invocar um shell para alimentar o texto para xmllint .

mysql … | xargs -L 1 sh -c 'echo "$0" | xmllint --format -'

Um loop de shell é o método mais fácil. A maneira canônica de fazer um loop por linhas é while IFS= read -r line; do … .

mysql … |
while IFS= read -r line; do printf '%s\n' "$line" | xmllint --format -; done
    
por 09.02.2012 / 01:28

Tags