2010-05-04 57 views
15

我有一個多行字符串來自另一個程序,我想要轉換爲SQL命令。我希望的printf能夠幫助我,但似乎並沒有工作:在bash中格式化stdin

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

我希望看到:

 
SELECT '1 
2 
3' INTO MyTable 

但我得到:

 
SELECT INTO MyTable 

如何我可以讓%s閱讀標準輸入嗎?

回答

24

使用xargs的改造標準輸入編程參數:

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

我知道有一種方法。我只是在看xargs,但不能將它拼湊在一起。這正是我想要的。 – User1 2010-05-04 18:53:02

+0

這將工作得很好,除了bash的printf不同於/ usr/bin/printf可執行文件,這意味着你不能使用「%q」。我帶着@丹尼斯威廉姆森的功能命令去了 – isaaclw 2014-10-27 19:04:55

2

你不能。該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腳本。

+0

是否有可能在問題提出的工作順序另一個命令? – User1 2010-05-04 02:17:25

+0

您可能能夠在'awk'的示例中接近簡單的'printf'用法。我會將其添加到我的答案。 – 2010-05-04 02:41:35

+0

@ User1,* xargs *命令有一些先例。它從stdin獲取數據並運行命令,並將數據分解爲多個參數以「模板」命令。你可以編寫一個像's =「$(cat)」;「$ @」「$ s」'的小shell程序(例如* 1args *),並將其用作'printf'%s \ n'1 2 3 | 1args printf「SELECT'%s'INTO MyTable \ n」'以維護您的訂單。但我不太相信它的效用。參數的大小是有限制的(每個操作系統有所不同),這會限制你可能在參數中插入多少標準輸入。 – 2010-05-04 02:54:00

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'