में एक चर से लाइन द्वारा लाइन पढ़ें, मेरे पास एक स्क्रिप्ट चर है जो बहु-रेखा है। मैं इस चर को लाइन से लाइन पढ़ने के लिए कैसे ट्रैक करूं और प्रत्येक लाइन को जिस तरह से चाहता हूं उसे संसाधित करता हूं?शैल स्क्रिप्टिंग
उत्तर
पर विचार बहु लाइन निम्न चर
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 देखें।
हालांकि मैं आम तौर पर बहु-पंक्ति चर प्रसंस्करण के लिए "पढ़ने के दौरान" का उपयोग करता हूं, लेकिन हाल ही में एक उदाहरण था जहां उसने फ़ाइल में प्रत्येक पंक्ति से अग्रणी स्थान हटा दिया था।
printf %s "$var" | while IFS= read -r line
do
echo "$line"
done
कोड this Unix Stack Exchange answer से लिया: यह बजाय तय मेरी समस्या का उपयोग करना।
- 1. शैल स्क्रिप्टिंग
- 2. शैल स्क्रिप्टिंग
- 3. शैल स्क्रिप्टिंग: xargs
- 4. शैल स्क्रिप्टिंग इनपुट पुनर्निर्देशन विषमता
- 5. शैल स्क्रिप्टिंग: किसी भी त्रुटि पर मरें
- 6. बैश शैल स्क्रिप्टिंग: मुझे क्या आसान तर्क है
- 7. यूनिक्स शैल स्क्रिप्टिंग में चर में मान कैसे जोड़ें?
- 8. मैं शैल स्क्रिप्टिंग के लिए रूबी का उपयोग कैसे करूं?
- 9. लिनक्स खोल स्क्रिप्टिंग
- 10. खोल स्क्रिप्टिंग में अपवाद हैंडलिंग?
- 11. शैल स्क्रिप्ट और सुरक्षा
- 12. शैल स्क्रिप्ट, संदेश
- 13. शैल स्क्रिप्ट
- 14. शैल
- 15. शैल
- 16. शैल
- 17. शैल
- 18. शैल
- 19. स्क्रिप्टिंग वर्चुअलenvwrapper mkvirtualenv
- 20. शैल स्क्रिप्ट वैश्विक कैसे बनाएं?
- 21. स्क्रिप्टिंग एसवीजी
- 22. स्क्रिप्टिंग ब्रिज
- 23. स्क्रिप्टिंग पुल
- 24. स्क्रिप्टिंग भाषाएं
- 25. सी # स्क्रिप्टिंग
- 26. बैच स्क्रिप्टिंग
- 27. रोज़लिन स्क्रिप्टिंग
- 28. स्कैला स्क्रिप्टिंग
- 29. थंडरबर्ड स्क्रिप्टिंग
- 30. स्क्रिप्टिंग ब्रिज
यह एक सही समाधान है, सिर्फ उत्सुक है, क्यों नहीं x = "a \ nb \ nc d e"? –
@ सेंथिलकुमार, उस स्ट्रिंग में 10 गुण हैं: 'ए', '\', 'एन', 'बी', आदि। "\ N" डबल कोट्स के अंदर विशेष नहीं हैं। बाश में, कोई स्ट्रिंग में एम्बेडेड वास्तविक न्यूलाइन के लिए '$" एक \ nb \ nc d e "' लिख सकता है। "-e" ध्वज "echo' को एक नई पंक्ति के रूप में संसाधित करने के लिए 'echo' बताता है, दो अनिवार्य वर्ण नहीं। – chepner
@chepner: thx, '$' मेरे लिए नया था, लेकिन यह सिंगल कोट्स '$' के साथ काम करता है \ nb \ nc d e'' –