我有以下 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
拆分以便于阅读,显然您不需要。是<<<$line
a ,它将toherestring
的内容作为标准输入提供。$line
xmllint
答案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