मान लीजिए कि आपके पास यह फ़ाइल है:
$ cat /tmp/test.txt
Line 1
Line 2 has leading space
Line 3 followed by blank line
Line 5 (follows a blank line) and has trailing space
Line 6 has no ending CR
चार तत्व हैं जो कई बैश समाधानों द्वारा पढ़े गए फ़ाइल आउटपुट के अर्थ को बदल देंगे:
- रिक्त पंक्ति 4;
- दो लाइनों पर रिक्त स्थान या अनुगामी;
- व्यक्तिगत लाइनों का अर्थ बनाए रखना (यानी, प्रत्येक पंक्ति एक रिकॉर्ड है);
- पंक्ति 6 सीआर के साथ समाप्त नहीं हुई।
यदि आप चाहते हैं कि पाठ फ़ाइल लाइन में रिक्त लाइनें शामिल हों, जिसमें सीआर के बिना रिक्त लाइनें और समाप्ति रेखाएं शामिल हैं, तो आपको थोड़ी सी लूप का उपयोग करना होगा और अंतिम पंक्ति के लिए आपके पास एक वैकल्पिक परीक्षण होना चाहिए।
यहां वे विधियाँ हैं जो फ़ाइल को बदल सकती हैं ( cat
रिटर्न की तुलना में ):
1) अंतिम पंक्ति और प्रमुख और अनुगामी रिक्त स्थान खोना:
$ while read -r p; do printf "%s\n" "'$p'"; done </tmp/test.txt
'Line 1'
'Line 2 has leading space'
'Line 3 followed by blank line'
''
'Line 5 (follows a blank line) and has trailing space'
(यदि आप इसके while IFS= read -r p; do printf "%s\n" "'$p'"; done </tmp/test.txt
बजाय करते हैं, तो आप अग्रणी और अनुगामी स्थानों को संरक्षित करते हैं, लेकिन सीआर के साथ समाप्त नहीं होने पर भी अंतिम पंक्ति खो देते हैं)
2) प्रक्रिया के प्रतिस्थापन के साथ cat
पूरी फाइल को एक ही बार में पढ़ा जाएगा और अलग-अलग लाइनों का अर्थ खो देगा:
$ for p in "$(cat /tmp/test.txt)"; do printf "%s\n" "'$p'"; done
'Line 1
Line 2 has leading space
Line 3 followed by blank line
Line 5 (follows a blank line) and has trailing space
Line 6 has no ending CR'
(आप निकालते हैं "
से $(cat /tmp/test.txt)
आप बल्कि एक घूँट से शब्द से फ़ाइल शब्द पढ़ें। इसके अलावा शायद क्या नहीं करना है ...)
एक फ़ाइल लाइन-बाय-लाइन पढ़ने और सभी रिक्ति को संरक्षित करने का सबसे मजबूत और सरल तरीका है:
$ while IFS= read -r line || [[ -n $line ]]; do printf "'%s'\n" "$line"; done </tmp/test.txt
'Line 1'
' Line 2 has leading space'
'Line 3 followed by blank line'
''
'Line 5 (follows a blank line) and has trailing space '
'Line 6 has no ending CR'
यदि आप प्रमुख और व्यापारिक स्थानों को पट्टी करना चाहते हैं, तो IFS=
भाग को हटा दें :
$ while read -r line || [[ -n $line ]]; do printf "'%s'\n" "$line"; done </tmp/test.txt
'Line 1'
'Line 2 has leading space'
'Line 3 followed by blank line'
''
'Line 5 (follows a blank line) and has trailing space'
'Line 6 has no ending CR'
(एक समाप्त बिना एक पाठ फ़ाइल \n
है, जबकि काफी आम, POSIX के तहत टूट माना जाता है। आप अनुगामी पर भरोसा कर सकते हैं \n
आप की जरूरत नहीं है || [[ -n $line ]]
में while
पाश।)
BASH अकसर किये गए सवाल पर अधिक