2010-05-04 6 views
15

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

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

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

 
SELECT '1 
2 
3' INTO MyTable 

Но я получил:

 
SELECT INTO MyTable 

Как могу ли я получить% s для чтения stdin?

ответ

24

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

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

Я знал, что есть способ. Я просто смотрел на xargs тоже, но не мог собрать его вместе. Это именно то, чего я хотел. – User1

+0

Это будет хорошо работать, за исключением того, что printf bash не совпадает с исполняемым файлом/usr/bin/printf, что означает, что вы не можете использовать «% q». Я пошел с функциональной командой от @Dennis Williamson – isaaclw

2

Вы не можете. Команда printf оболочки форматирует его аргументы не стандартный ввод, так что вы можете сделать, это обеспечить выход команды в качестве единственного аргумента:

bash$ printf "SELECT '%s' INTO MyTable" "`echo -e '1\n2\n3'`" 
SELECT '1 
2 
3' INTO MyTable 
bash$ 

Edit: раствор в 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$ 

I «Я оставлю листок последней новой строки в качестве упражнения для читателя. Если вы хотите сделать что-то более сложное в printf, вам придется придумать еще один креативный скрипт awk.

+0

Есть еще одна команда, которая могла бы работать в порядке, предложенной в вопросе? – User1

+0

Возможно, вы сможете приблизиться к простому использованию 'printf' в вашем примере с помощью' awk'. Я добавлю это к своему ответу. –

+0

@ User1. В команде * xargs * есть несколько прецедентов. Он принимает данные из stdin и запускает команды с данными, разбитыми на несколько аргументов, на команду «шаблон». Вы можете написать небольшую программу оболочки (например, называемую * 1args *), такую ​​как 's =" $ (cat) ";" $ @ "" $ s "' и использовать ее как 'printf '% s \ n' 1 2 3 | 1args printf "ВЫБРАТЬ '% s' INTO MyTable \ n" 'для поддержания вашего заказа. Но я не совсем уверен в его полезности. Существует ограничение на размер аргументов (различается для каждой ОС), что ограничит количество stdin, которое вы можете использовать в аргументе. –

5

Дайте этому попытку:

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

echo -e '1\n2\n3' | printf_stdin 'SELECT %s INTO MyTable' 
Смежные вопросы