2011-09-06 17 views
40

रखने के लिए जब मैं "बिल्ली test.file" उपयोग करें, यह दिखा देंगेउपयोग बैश लाइन द्वारा लाइन पढ़ सकते हैं और अंतरिक्ष

1 
2 
    3 
    4 

मैं बैश फ़ाइल का उपयोग करते हैं,

cat test.file | 
while read data 
do 
    echo "$data" 
done 

यह दिखा देंगे

1 
2 
3 
4 

मैं मूल परीक्षण फ़ाइल की तरह परिणाम कैसे बना सकता हूं?

उत्तर

70
IFS='' 
cat test.file | 
while read data 
do 
    echo "$data" 
done 

मुझे पता है आप कुछ है जो वास्तव में एक पाइप लाइन की जरूरत से उदाहरण सरलीकृत हो सकता है, लेकिन इससे पहले किसी और को यह कहते हैं:

IFS='' 
while read data; do 
    echo "$data" 
done < test.file 
+0

क्योंकि लिपि प्रति पंक्ति एक एकल चर में पढ़ रही है, डेटा के भीतर किसी भी रिक्त स्थान (पहले गैर-खाली के बाद) को संरक्षित किया जाता है। लेकिन खाली आईएफएस प्रमुख रिक्त स्थान (ksh और bash में) को संरक्षित करता है। –

+15

यह एक ऐसा स्थान है जहां आप लिख सकते हैं 'जबकि आईएफएस = डेटा पढ़ना; ... ' –

+0

@glennjackman मैं' निर्यात IFS' को आजमाने की कोशिश कर रहा था ..., अच्छा मैंने आपको टिप पढ़ा! –

1

read data डेटा को आईएफएस द्वारा विभाजित करेगा, जो आमतौर पर "\ t \ n" होता है। यह आप के लिए रिक्त स्थान को सुरक्षित करेगा:

var=$(cat test.file) 
echo "$var" 
0

वैकल्पिक रूप से, एक अच्छा पार्स करने उपकरण फ़ाइल का उपयोग, awk

awk '{ 
# do your stuff 
print 
}' file 
2

वैसे ही जैसे DigitalRoss की रेस के पूरक ponse। उस मामले के लिए आप केवल इस कमांड के लिए IFS को बदलना चाहते हैं, आप घुंघराले ब्रेसिज़ का उपयोग कर सकते हैं। यदि आप करते हैं, तो आईएफएस का मूल्य केवल ब्लॉक के अंदर ही बदला जाएगा। इस तरह:

(रिक्त स्थानों रखने)
echo ' 
    word1 
    word2' | { IFS='' ; while read line ; do echo "$line" check ; done ; } 

उत्पादन किया जाएगा:

word1 check 
    word2 check 
+0

भले ही अनसेट 'IFS' पहले से ही इस विशेष उदाहरण को बचाता है, फिर भी आपको '" $ line "उद्धृत करना चाहिए। वास्तविक दुनिया के उदाहरण में, मूल्य में अभी भी शेल वाइल्डकार्ड और क्या नहीं हो सकता है। – tripleee

8

वास्तव में, यदि आप "पढ़ें" कॉल करने के लिए एक तर्क नहीं दे रहे हों, पढ़ने के लिए एक डिफ़ॉल्ट चर सेट हो जाएगा $ REPLY कहा जाता है जो व्हाइटस्पेस को संरक्षित रखेगा। तो आप बस यह कर सकते हैं:

$ cat test.file | while read; do echo "$REPLY"; done 
+1

यह जानना अच्छा है। पता नहीं क्यों आपको एक डाउनवोट मिला है। शायद यह विश्वसनीय नहीं है, यह नहीं पता कि यह सभी प्लेटफार्मों में समान है या नहीं। कभी-कभी यह जानना अच्छा होता है कि क्यों कोई डाउनवोट प्राप्त करता है। – 244an

+0

इस उत्तर ने मुझे 'read' के लिए दस्तावेज़ीकरण को बारीकी से पढ़ने के लिए प्रेरित किया। –

+0

यह * अग्रणी * व्हाइटस्पेस को संरक्षित नहीं करता है जो ओपी –

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