2010-05-04 14 views
15

Bir SQL komutuna dönüştürmek istediğim başka bir programdan gelen çok satırlı bir dizim var. Ben Printf bana yardımcı olabilir umuyordum, ama işe görünmüyor:Biçimdeki stdin in bash

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

görmeyi umuyordum:

 
SELECT '1 
2 
3' INTO MyTable 

Ama var:

 
SELECT INTO MyTable 

nasıl stdin'i okumak için% s alabilir miyim?

cevap

24

Kullanım xargsstdin'nin argümanları program dönüştürmek için:

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

Bir yol olduğunu biliyordum. Ben de xargs'a bakıyordum ama birlikte parçalayamadım. Tam istediğim bu. – User1

+0

Bu işe yarar, bash'ın printf/usr/bin/printf yürütülebilir ile aynı olmaması dışında, "% q" kullanamazsınız demektir. @Dennis Williamson'dan gelen işlevsel komutla gittim – isaaclw

2

Yapamazsınız.

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

Düzenleme: awk

bir çözüme
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$ 

ben printf kabuk komut böylece neler yapabileceğini tek argüman olarak bir komutun çıktısını sağlamak olduğunu onun argümanları değil standart girdi biçimleri Son yeni satırı okuyucunun bir alıştırması olarak sıyırmayı bırakacağım. printf'da daha karmaşık bir şey yapmak istiyorsanız, daha yaratıcı bir awk komut dosyası ile gelmeniz gerekecektir.

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

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

Söz konusu teklif edilen sırayla işe yarayabilir başka komut var mı – User1

+0

Örneğinizde 'awk' ile basit' printf 'kullanımına yakın olabilirsiniz. Cevabımı ekleyeceğim. –

+0

@ User1, * xargs * komutunda bir parça emsal var. Veriyi stdin'den alır ve komutları, birden fazla argümana ayrılmış veriyi “şablon” komutuna getirir. 'S = "$ (cat)"; "$ @" "$ s" gibi küçük bir kabuk programı yazabilir (örn. * 1args *) ve bunu printf olarak kullanabilirsiniz% s \ n' 1 2 3 | 1args printf "SELECT '% s' MyTOable \ n" 'siparişinizi korumak için. Ama onun faydası konusunda ikna olmadım. Argümanların boyutuyla ilgili bir sınırlama vardır (OS başına farklılık), bir argümanda ne kadar stdin olabileceğini sınırlayacaktır. –

5

bu bir deneyin?