Ответ 1
Используйте xargs для преобразования stdin в аргументы программы:
echo -n -e '1\n2\n3' |xargs -0 printf 'SELECT %s INTO MyTable'
У меня есть многострочная строка, идущая из другой программы, которую я хочу преобразовать в команду SQL. Я надеялся, что printf может мне помочь, но, похоже, это не работает:
echo -e '1\n2\n3'|printf 'SELECT %s INTO MyTable'
Я надеялся увидеть:
SELECT '1 2 3' INTO MyTable
Но я получил:
SELECT INTO MyTable
Как я могу заставить% s читать stdin?
Используйте 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 "[email protected]" "$stdin"; }
echo -e '1\n2\n3' | printf_stdin 'SELECT %s INTO MyTable'
Вы не можете. Команда 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 script.