Bash에서는 한 명령의 출력을 한 줄씩 다른 명령줄에 공급합니다.

Bash에서는 한 명령의 출력을 한 줄씩 다른 명령줄에 공급합니다.

mysql의 단일 열에서 XML을 가져와 차단하고 이를 아름답게 하기 위해 xmllint에 공급하는 다음 bash 명령이 있습니다.

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

지금까지는 괜찮았지만 한 번에 한 행에서만 작동합니다. SQL 쿼리 출력의 각 행이 xmlint에 대한 별도의 호출에 제공되도록 이를 조정하고 싶습니다.

나는 이것이 bash 스크립트의 루프를 사용하여 수행될 수 있다는 것을 알고 있습니다. 그러나 가능하다면 한 줄의 코드로 수행하고 싶습니다. 아마도 이것은 xargs를 사용하여 수행할 수 있지만 이해가 되지 않습니다.

답변1

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

더 쉽게 읽을 수 있도록 분할할 필요는 없습니다. 는 표준 입력으로 to의 내용을 제공하는 입니다 <<<$line.herestring$linexmllint

답변2

이는 에서 가능 xargs하지만 각 행은 표준 입력이 아닌 에 xargs인수로 전달됩니다 . 에 텍스트를 공급하려면 셸을 호출 xmllint해야 합니다 .xargsxmllint

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

쉘 루프는 가장 간단한 방법입니다. 행을 반복하는 표준 방법은 다음과 같습니다.while IFS= read -r line; do ….

mysql … |
while IFS= read -r line; do printf '%s\n' "$line" | xmllint --format -; done

관련 정보