2011-02-26 24 views
19

मैं कैसे मार में एक फ़ाइल से पढ़ने का एक बुनियादी उदाहरण के रूप में शुद्ध भर से निम्नलिखित संरचना ले रहा हूँ करने के लिए अपने टैब परिवर्तन:इको रिक्त स्थान

cat inputfile.txt | while read line; do echo $line; done 

मेरे inputfile.txt टैब-सीमांकित है, हालांकि, और उपरोक्त आदेश से बाहर आने वाली रेखाएं अंतरिक्ष-सीमित हैं।

यह मुझे मेरे वास्तविक अनुप्रयोग में समस्याएं पैदा कर रहा है, जो कि ऊपर की तुलना में अधिक जटिल है: मैं लाइन लेना चाहता हूं, इसके आधार पर कुछ नई चीजें उत्पन्न करना चाहता हूं, और उसके बाद मूल रेखा और नई सामग्री को आउटपुट करना चाहता हूं अतिरिक्त खेतों और पाइपलाइन cut -d ' ' और sed -e 's/ /\t/g' के गुच्छा के बिना पर्याप्त जटिल होने जा रही है (जो वैसे भी रिक्त स्थान वाले टैब-सीमांकित डेटा के लिए सुरक्षित नहीं होगी)।

मैंने आईएफएस समाधानों को देखा है, लेकिन वे इस मामले में मदद नहीं कर रहे हैं। मैं जो चाहता हूं वह एक ओएफएस है ... सिवाय इसके कि मैं गूंज में हूं, अजीब नहीं! मुझे लगता है कि अगर मैं इसे जो कुछ भी देता हूं उसे थूकने के लिए सिर्फ गूंज प्राप्त कर सकता हूं, तो मैं अच्छा आकार में रहूंगा। कोई विचार? धन्यवाद!

+2

आप अक्सर एक पाइप लाइन के हिस्से के रूप बिल्ली का उपयोग करने के लिए, बस फ़ाइल से सीधे अगले आदेश के stdin पुनर्निर्देशित की जरूरत नहीं है: 'पढ़ने के दौरान लाइन; echo $ लाइन करें; किया

उत्तर

28

प्रयास करें:

cat inputfile.txt | while read line; do echo "$line"; done 
बजाय

दूसरे शब्दों में, यह read टैब को प्रतिस्थापित नहीं करता है, यह echo है।

निम्नलिखित प्रतिलेख (<<tab>> का उपयोग कर जहां टैब हैं) देखें:

pax$ echo 'hello<<tab>>there' | while read line ; do echo $line ; done 
hello there 

pax$ echo 'hello<<tab>>there' | while read line ; do echo "$line" ; done 
hello<<tab>>there 
+2

अच्छा दुख; यह इतना आसान था? धन्यवाद! किसी भी तरह उद्धरण डालने के लिए अच्छा अभ्यास। –

+2

टैब को प्रतिस्थापित करना (बीए) sh और echo के बीच साजिश है। 'echo $ line' शब्दों को शब्दों में विभाजित करें, जिन्हें तब ग्लोब किया जाता है और गूंजने के लिए अलग से पारित किया जाता है, जो तब उन्हें रिक्त स्थान के साथ जोड़ता है। 'echo" $ line "' स्ट्रिंग को पास करता है। तुलनात्मक रूप से, डॉस/विंडोज 'echo% line%' इन चीजों में से कोई भी नहीं है (और वास्तव में echos अक्षर अक्षर भी उद्धृत करता है)। – Neil

+10

बीटीडब्ल्यू 'रीड' अग्रणी और पिछली जगहों को पीछे छोड़ देगा, इसलिए यदि आप अग्रणी/पीछे वाले टैब को संरक्षित करना चाहते हैं, तो '... IFS = read line ...' (ध्यान दें कि आईएफएस के असाइनमेंट के बाद से उपसर्ग है कमांड पढ़ें, यह केवल उस पर लागू होता है और बाद में रीसेट नहीं किया जाता है)। –

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