2012-01-01 15 views
7

पर मैक OSX बैश में पर विभाजन लाइनों, मैं एक फ़ाइल (परीक्षण का मामला) है कि लाइनों शामिल हैबैश में, "के लिए; गूंज करते हैं, किया" रिक्त स्थान

x xx xxx 
xxx xx x 

लेकिन जब मैं आदेश पर अमल

for i in `cat r.txt`; do echo "$i"; done 

परिणाम

x xx xxx 
xxx xx x 

नहीं है के रूप में मैं चाहता हूँ बल्कि

x 
xx 
xxx 
xxx 
xx 
x 

मैं echo मुझे 'x xx xxx' कैसे दे सकता हूं?

+0

awk 'gsub (/ /, "\ n") {} प्रिंट ' या sed's// \ n/g' – kenny

उत्तर

16

डिफ़ॉल्ट रूप से, लूप के लिए एक बैश सभी सफेद जगहों पर विभाजित होता है। के रूप में सुझाव

IFS=$'\n' 
for i in `cat r.txt`; do echo "$i"; done 
unset IFS 
+0

शायद ओपी को पढ़ने के दौरान 'उपयोग करने की ओर इंगित करता है; कर ...; इसके बजाय

+0

@ फ़्रेड्रिक: शायद, हालांकि यह एक अलग सबहेल में प्रत्येक पुनरावृत्ति चलाता है ... –

+0

सही। धन्यवाद। मैंने 'थोड़ी' विधि को देखा था, लेकिन मेरे पास इसके साथ अन्य मुद्दे थे जो इस गूंज मुद्दे से अधिक कठिन लग रहा था। – atheaos

-1
IFS="\n" 
for i in `cat r.txt`; do echo "$i"; done 
unset IFS 
+1

काम नहीं करता है ... –

+0

@OliCharlesworth आकस्मिक रूप से, क्योंकि मैं आपके उत्तर का परीक्षण कर रहा था, मैंने गलती से $ छोड़ दिया और वास्तव में एरिनियल के पास टाइप किया। इसने काम कर दिया। हालांकि अब मैं इसे अधिक शामिल डेटा पर चलाता हूं, लेकिन मुझे लगता है कि अन्य दुष्प्रभाव स्पष्ट रूप से हैं। – atheaos

+0

@atheaos: क्या आप निश्चित हैं? '" \ n "' बैश में सी के समान नहीं है। उदाहरण के लिए अपना 'echo' कथन बदलकर देखें। 'echo "LINE: $ i" यह देखने के लिए कि वास्तव में क्या चल रहा है। –

3

या तो IFS स्थापित करने या while का उपयोग करें:: आप IFS चर सेट करके कि ओवरराइड कर सकते हैं

while read theline; do echo "$theline"; done <thefile 
+0

यह इंगित किया जाना चाहिए कि यह प्रत्येक पुनरावृत्ति को एक अलग सबहेल में चलाता है ... –

+0

हां, वास्तव में। संपादित। – fge

+0

यह वह क्षमता नहीं है जिसके बारे में मैं सोच रहा था। इसके बजाय, मैं परिवर्तनीय दायरे की समस्या के बारे में सोच रहा था (चर "लूप" के अंदर "अंदर" और "बाहर" के बीच साझा नहीं किया जाता है। –

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