Формат stdin в bash

У меня есть многострочная строка, идущая из другой программы, которую я хочу преобразовать в команду SQL. Я надеялся, что printf может мне помочь, но, похоже, это не работает:

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

Я надеялся увидеть:

SELECT '1
2
3' INTO MyTable

Но я получил:

SELECT  INTO MyTable

Как я могу заставить% s читать stdin?

Ответы

Ответ 1

Используйте xargs для преобразования stdin в аргументы программы:

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

Ответ 2

Попробуйте:

printf_stdin() { local stdin; read -d '' -u 0 stdin; printf "[email protected]" "$stdin"; }

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

Ответ 3

Вы не можете. Команда 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.