У меня есть многострочная строка, прибывающая из другой программы, которую я хочу преобразовать в команду 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 "$@" "$stdin"; }
echo -e '1\n2\n3' | printf_stdin 'SELECT %s INTO MyTable'
Нельзя. Команда оболочки printf
форматирует свои аргументы не стандартным вводом, поэтому вы можете предоставить вывод команды как единственный аргумент:
bash$ printf "SELECT '%s' INTO MyTable" "`echo -e '1\n2\n3'`"
SELECT '1
2
3' INTO MyTable
bash$
Edit: a solution in 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.