Bashは、あるコマンドの出力を1行ずつ別のコマンドラインに供給します。

Bashは、あるコマンドの出力を1行ずつ別のコマンドラインに供給します。

mysqlの単一列からXMLを取得してブロックし、それを美しくするためにxmllintに供給する次のbashコマンドがあります。

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

これまでは大丈夫でしたが、一度に1行だけで動作します。 SQLクエリ出力の各行がxmlintへの別々の呼び出しに提供されるようにこれを調整したいと思います。

私はこれがbashスクリプトのループを使って実行できることを知っています。しかし、可能であれば、1行のコードで実行したいと思います。おそらくこれは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の内容を提供することです<<<$lineherestring$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

関連情報