我有一个来自另一个程序的多行字符串,我想将其转换为SQL命令。我希望printf可以帮助我,但它似乎不起作用:
echo -e '1\n2\n3'|printf 'SELECT %s INTO MyTable'
我希望看到:
SELECT '1 2 3' INTO MyTable
但我得到了:
SELECT INTO MyTable
如何让%s读取标准输入?
答案 0 :(得分:33)
使用 xargs 将 stdin 转换为程序参数:
echo -n -e '1\n2\n3' |xargs -0 printf 'SELECT %s INTO MyTable'
答案 1 :(得分:5)
尝试一下:
printf_stdin() { local stdin; read -d '' -u 0 stdin; printf "$@" "$stdin"; }
echo -e '1\n2\n3' | printf_stdin 'SELECT %s INTO MyTable'
答案 2 :(得分:2)
你做不到。 printf
shell命令将其参数格式化为非标准输入,因此您可以将命令的输出作为单个参数提供:
bash$ printf "SELECT '%s' INTO MyTable" "`echo -e '1\n2\n3'`"
SELECT '1
2
3' INTO MyTable
bash$
修改:Awk中的解决方案
bash$ echo -e '1\n2\n3' | awk -v 'ORS=' '
BEGIN { print "SELECT \"" }
{ print $0, "\n" }
END { print "\" INTO MyTable" }'
SELECT "1
2
3
" INTO MyTable
bash$
我会把最后的换行线剥离给读者。如果你想在printf
中做更复杂的事情,那么你将不得不想出一些更有创意的awk脚本。