在 bash 中,将一个命令的输出逐行输入到另一个命令中

在 bash 中,将一个命令的输出逐行输入到另一个命令中

我有以下 bash 命令,它从 mysql 中的单个列获取并阻止 XML,并将其输入到 xmllint 中以对其进行美化。

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

拆分以便于阅读,显然您不需要。是<<<$linea ,它将toherestring的内容作为标准输入提供。$linexmllint

答案2

这对于 是可能的xargs,但xargs会将每一行作为参数传递给xmllint,而不是在其标准输入上。您需要xargs调用 shell 将文本提供给xmllint.

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

shell 循环是最简单的方法。循环行的规范方法是while IFS= read -r line; do …

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

相关内容