我有一个来自另一个程序的多行字符串,想将其转换为SQL命令。我希望printf可以帮助我,但它似乎不起作用:
echo -e '1\n2\n3'|printf 'SELECT %s INTO MyTable'
我希望看到:
SELECT '1 2 3' INTO MyTable
但我得到了:
SELECT INTO MyTable
如何让%s读取标准输入?
我有一个来自另一个程序的多行字符串,想将其转换为SQL命令。我希望printf可以帮助我,但它似乎不起作用:
echo -e '1\n2\n3'|printf 'SELECT %s INTO MyTable'
我希望看到:
SELECT '1 2 3' INTO MyTable
但我得到了:
SELECT INTO MyTable
如何让%s读取标准输入?
使用 xargs 将 stdin 转换为程序参数:
echo -n -e '1\n2\n3' |xargs -0 printf 'SELECT %s INTO MyTable'
试一试这个:
printf_stdin() { local stdin; read -d '' -u 0 stdin; printf "$@" "$stdin"; }
echo -e '1\n2\n3' | printf_stdin 'SELECT %s INTO MyTable'
printf_stdin() { local stdin; IFS='' read -r -d '' -u 0 stdin; printf "$1" "$stdin"; }
。特别是IFS=''
(没有它,我会丢失尾随的换行符)和-r
(将输入中的\
视为字面量)。"$1"
比"$@"
更有意义,后者可能会产生模棱两可的结果。 - undefinedprintf
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脚本。
awk
接近于你示例中简单的printf
用法。我会在我的答案中添加它。 - D.Shawleys="$(cat)";"$@" "$s"
,并将其用作 printf '%s\n' 1 2 3 | 1args printf "SELECT '%s' INTO MyTable\n"
来维护您的顺序。但我还不太确定它的实用性。参数的大小有限制(每个操作系统不同),这将限制您可以将多少 stdin 填充到一个参数中。 - Chris Johnsen