2010-01-05 23 views
8

मैं:बैश: अतिरिक्त जगह जोड़ने इको क्यों है?

$ echo -e "D"{a,b,c}".jpg\n" 
Da.jpg 
Db.jpg 
Dc.jpg 

नोट: उत्पादन के 2 और 3 लाइन पर Db और डीसी से पहले अतिरिक्त रिक्त स्थान।

ये क्यों हैं?

धन्यवाद, दान

संपादित: चूंकि मेरे वास्तविक उद्देश्य उस में रिक्त स्थान (जो मैं मूल रूप से लिखा जाना चाहिए था) था:

echo -e "Name"{,.}" "{-,}"extra"{,so}" 5v5 "{one,two,No\ four}{,!,\!\!}"\n" 

अधिकांश यहाँ समाधान मेरे लिए काम नहीं किया (लूप, xarg, tr के लिए)। प्रिंटफ ने कई ब्रेसिज़ विस्तारों के कारण काम नहीं किया जो मैं कैंटीनियन उत्पाद चाहता हूं।

मैं 3 समाधान संयुक्त (mletterle के \ ख, डेनिस विलियमसन अतिरिक्त स्थान, और जिम डेनिस के अब तक कम उद्धरण का उपयोग) प्राप्त करने के लिए:

echo -e "" \\bName{,.}\ {-,}extra{,so}\ 5v5\ {one,two,No\ four}{,\!,\!\!}\\n 

धन्यवाद सब जो उत्तर दिया है! मैंने आपके जवाबों से बहुत कुछ सीखा!

दान

+2

'echo' यहां कुछ भी नहीं कर सकता है, इसे' bash' से रिक्त स्थान मिल रहा है। –

+1

इसके आसपास काम करने के लिए: echo -e डी {ए, बी, सी} .jpg \\ n | tr -d "" (डीडी --- हटाएं विकल्प के साथ उपयोगिता अनुवाद)। (बीटीडब्ल्यू: आपको उन सभी उद्धरणों की आवश्यकता नहीं है, केवल एक अतिरिक्त \ पर्याप्त है)। –

उत्तर

0

सबसे आसान और साफ समाधान प्रत्येक पंक्ति के सामने एक बैकस्पेस जोड़ने के लिए है:

echo -e -n "\bD"{a,b,c}".jpg\n" 

यह वांछित आउटपुट पैदा करता है।

+0

मेरी उबंटू डैपर मशीन पर नहीं - यह दूसरी पंक्ति के लिए 'डीबी.जेपीजी 'देता है, जो सही है, लेकिन' ए। jpg' पहली पंक्ति के लिए, जो नहीं है। दूसरी तरफ, यह मेरे मैक चलने वाले तेंदुए पर काम करता है। –

+0

यह अजीब है .. यह मेरे उबंटू कर्मिक कोआला मशीन पर काम करता है ... अजीब। – mletterle

+0

मुझे लगता है कि कुछ कीड़े तय की गई थीं डैपर और कोआला के बीच :) –

4

echo हमेशा बहस के बीच रिक्त स्थान कहते हैं। \n के बिना अपना आदेश आज़माएं और परिणामों की तुलना करें।

+3

यह रिक्त स्थान जोड़ने 'echo' नहीं है। कमांडलाइन पर '' डी "{ए, बी, सी}"। Jpg "' कोशिश करें - आपको 'bash: da.jpg: कमांड नहीं मिला'। यह ब्रेस विस्तार रिक्त स्थान जोड़ता है। –

+1

ब्रेस विस्तार राइट्स स्पेस के साथ तर्क को अलग करता है; गूंज तर्क के बीच एक जगह जोड़ता है। तर्कों के बीच रिक्त स्थान के पूरे समूह के साथ 'echo foo [space] [space] [space] [space] [space] [space] [space] bar' आज़माएं। –

+0

... सही, लेकिन अप्रासंगिक। लेकिन यहां समस्या यह है कि ब्रेस विस्तार एक ऐसी जगह जोड़ रहा है जो दान नहीं चाहता है। 'echo' कुछ भी जोड़ या घटा नहीं रहा है। –

9

क्योंकि यह ब्रेस विस्तार क्या करता है। man bash से, के तहत शीर्षक Brace expansion: विस्तार ब्रेस

पैटर्न होने के लिए एक वैकल्पिक प्रस्तावना के रूप है, से ... अल्पविराम से अलग तार की एक श्रृंखला ... एक वैकल्पिक के बाद पीछा ले परिशिष्ट भाग। प्रस्तावना ब्रेसिज़ के भीतर निहित प्रत्येक स्ट्रिंग के लिए पहले से जुड़ा हुआ है, और उपसंहार तो प्रत्येक परिणामस्वरूप स्ट्रिंग में जोड़ा जाता है, सही उदाहरण के लिए के लिए छोड़ दिया विस्तार हो रहा है, एक {डी, सी, बी} ई 'एडीई इक्का अबे में विस्तारित '

तो आपके उदाहरण में, "डी" प्रस्तावना है और ".jpg \ n" पोस्टस्क्रिप्ट है।

तो, ब्रेस विस्तार होता है के बाद, आप के साथ छोड़ दिया जाता है:

echo -e Da.jpg\n Db.jpg\n Dc.jpg\n

hewgill points out के रूप में, खोल तो तीन टोकन में इस विभाजन और उन्हें गुजरता प्रतिध्वनित करने के लिए; जो प्रत्येक टोकन को एक स्थान से अलग करता है। आपके इच्छित आउटपुट प्राप्त करने के लिए, आपको यहां कई सुझावों में से एक का उपयोग करना होगा जो टोकन के बीच अवांछित स्थान को फिर से सम्मिलित नहीं करते हैं।

यह यह करने के लिए लंबे समय तक और शायद नहीं neatest तरीका नहीं है, लेकिन निम्न उत्पादन देता है आप के बाद कर रहे हैं:

for file in "D"{a,b,c}".jpg" 
do 
    echo ${file} 
done 
+0

महान स्पष्टीकरण के लिए धन्यवाद! – Dan

2

आप तर्क से थूक अलग करने के लिए xargs का उपयोग करके वांछित प्रभाव प्राप्त कर सकते हैं एक लाइन में पहले गूंज प्रत्येक:

$ echo "D"{a,b,c}".jpg" | xargs -n1 echo 
Da.jpg 
Db.jpg 
Dc.jpg 
+0

ओह, स्वादिष्ट। मुझे लूप के लिए यह बहुत अच्छा लगता है। –

9

अधिक पोर्टेबल printf

$ printf "D%s.jpg\n" {a,b,c} 
Da.jpg 
Db.jpg 
Dc.jpg 
+0

+1 POSIXy तरीके से सुझाव देने और अपने सभी नुकसान के साथ गूंज से बचने के लिए +1। – Jens

1

का उपयोग आप एक अशक्त prepending द्वारा अधिक सुसंगत दृष्टिकोण प्राप्त कर सकते:

$ echo -en "" "D"{a..c}".jpg\n" 
Da.jpg 
Db.jpg 
Dc.jpg 

अब वे सब एक अतिरिक्त जगह है। इसके अलावा, -n का उपयोग अंत में अतिरिक्त नई लाइन को समाप्त करता है। इसके अलावा, आप अपने ब्रेस विस्तार में एक सीमा का उपयोग कर सकते हैं।

संबंधित मुद्दे