我有一個多行字符串來自另一個程序,我想要轉換爲SQL命令。我希望的printf能夠幫助我,但似乎並沒有工作:在bash中格式化stdin
echo -e '1\n2\n3'|printf 'SELECT %s INTO MyTable'
我希望看到:
SELECT '1 2 3' INTO MyTable
但我得到:
SELECT INTO MyTable
如何我可以讓%s閱讀標準輸入嗎?
我有一個多行字符串來自另一個程序,我想要轉換爲SQL命令。我希望的printf能夠幫助我,但似乎並沒有工作:在bash中格式化stdin
echo -e '1\n2\n3'|printf 'SELECT %s INTO MyTable'
我希望看到:
SELECT '1 2 3' INTO MyTable
但我得到:
SELECT INTO MyTable
如何我可以讓%s閱讀標準輸入嗎?
使用xargs的改造標準輸入編程參數:
echo -n -e '1\n2\n3' |xargs -0 printf 'SELECT %s INTO MyTable'
你不能。該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腳本。
是否有可能在問題提出的工作順序另一個命令? – User1 2010-05-04 02:17:25
您可能能夠在'awk'的示例中接近簡單的'printf'用法。我會將其添加到我的答案。 – 2010-05-04 02:41:35
@ 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
試試這個:
printf_stdin() { local stdin; read -d '' -u 0 stdin; printf "[email protected]" "$stdin"; }
echo -e '1\n2\n3' | printf_stdin 'SELECT %s INTO MyTable'
我知道有一種方法。我只是在看xargs,但不能將它拼湊在一起。這正是我想要的。 – User1 2010-05-04 18:53:02
這將工作得很好,除了bash的printf不同於/ usr/bin/printf可執行文件,這意味着你不能使用「%q」。我帶着@丹尼斯威廉姆森的功能命令去了 – isaaclw 2014-10-27 19:04:55