Формат stdin в ударе

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

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

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

SELECT '1
2
3' INTO MyTable

Но я добрался:

SELECT  INTO MyTable

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

21
задан User1 4 May 2010 в 02:07
поделиться

3 ответа

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

echo -n  -e '1\n2\n3' |xargs -0  printf 'SELECT %s INTO MyTable'
33
ответ дан 29 November 2019 в 20:39
поделиться

Попробуйте это:

printf_stdin() { local stdin; read -d '' -u 0 stdin; printf "$@" "$stdin"; }

echo -e '1\n2\n3' | printf_stdin 'SELECT %s INTO MyTable'
5
ответ дан 29 November 2019 в 20:39
поделиться

Нельзя. Команда оболочки 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.

2
ответ дан 29 November 2019 в 20:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: