在bash中格式化stdin

时间:2010-05-04 02:07:30

标签: bash

我有一个来自另一个程序的多行字符串,我想将其转换为SQL命令。我希望printf可以帮助我,但它似乎不起作用:

echo -e '1\n2\n3'|printf 'SELECT %s INTO MyTable'

我希望看到:

SELECT '1
2
3' INTO MyTable

但我得到了:

SELECT  INTO MyTable

如何让%s读取标准输入?

3 个答案:

答案 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脚本。