2012-08-10 14 views
10

में एक चर से लाइन द्वारा लाइन पढ़ें, मेरे पास एक स्क्रिप्ट चर है जो बहु-रेखा है। मैं इस चर को लाइन से लाइन पढ़ने के लिए कैसे ट्रैक करूं और प्रत्येक लाइन को जिस तरह से चाहता हूं उसे संसाधित करता हूं?शैल स्क्रिप्टिंग

उत्तर

21

पर विचार बहु ​​लाइन निम्न चर

x=$(echo -e "a\nb\nc d e") 

और प्रत्येक पंक्ति के लिए एक सरल प्रक्रिया: सिर्फ echo यह एक उपसर्ग = LINE: साथ और रेखा के आसपास एकल उद्धरण के साथ। निम्नलिखित कोड का या तो उस आवश्यकता को पूरा करेगा:

while read line; do echo "LINE: '${line}'"; done <<< "$x" 

या

while read line; do echo "LINE: '${line}'"; done < <(echo "$x") 

न तो एक subshell (ताकि आप, उदाहरण के लिए, पाश में चर सेट और इसके बाहर भी पहुंच सकते हैं) बनाता है, और दोनों उत्पादन

LINE: 'a' 
LINE: 'b' 
LINE: 'c d e' 

लेकिन बजाय लगता है तुम हो

x=$(echo -e "a \n b\nc d e") 
# note--------^--^ 

और यह आपके आवेदन के लिए अग्रणी और पिछला सफेद जगह है (उदाहरण के लिए, गिट चीनी मिट्टी के बरतन पार्सिंग)। उपर्युक्त कोड दोनों पूर्ववर्ती चर/डेटा के लिए बिल्कुल वही आउटपुट देंगे जो पूर्व के लिए है, जो आप नहीं चाहते हैं। अग्रणी और पिछली सफेद जगह को संरक्षित करने के लिए, while read line को while IFS= read -r line के साथ बदलें। अर्थात, और निम्नलिखित कोड

while IFS= read -r line; do echo "LINE: '${line}'"; done <<< "$x" 

या

while IFS= read -r line; do echo "LINE: '${line}'"; done < <(echo "$x") 

दोनों में से किसी का उत्पादन करेगा

LINE: 'a ' 
LINE: ' b' 
LINE: 'c d e' 

जानकारी के लिए Greg Wooledge's excellent Bash FAQ देखें।

+0

यह एक सही समाधान है, सिर्फ उत्सुक है, क्यों नहीं x = "a \ nb \ nc d e"? –

+0

@ सेंथिलकुमार, उस स्ट्रिंग में 10 गुण हैं: 'ए', '\', 'एन', 'बी', आदि। "\ N" डबल कोट्स के अंदर विशेष नहीं हैं। बाश में, कोई स्ट्रिंग में एम्बेडेड वास्तविक न्यूलाइन के लिए '$" एक \ nb \ nc d e "' लिख सकता है। "-e" ध्वज "echo' को एक नई पंक्ति के रूप में संसाधित करने के लिए 'echo' बताता है, दो अनिवार्य वर्ण नहीं। – chepner

+0

@chepner: thx, '$' मेरे लिए नया था, लेकिन यह सिंगल कोट्स '$' के साथ काम करता है \ nb \ nc d e'' –

1

हालांकि मैं आम तौर पर बहु-पंक्ति चर प्रसंस्करण के लिए "पढ़ने के दौरान" का उपयोग करता हूं, लेकिन हाल ही में एक उदाहरण था जहां उसने फ़ाइल में प्रत्येक पंक्ति से अग्रणी स्थान हटा दिया था।

printf %s "$var" | while IFS= read -r line 
do 
    echo "$line" 
done 

कोड this Unix Stack Exchange answer से लिया: यह बजाय तय मेरी समस्या का उपयोग करना।

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