नई सामग्री के साथ यूनिक्स चर में फ़ाइल सामग्री


117

मेरे पास निम्नलिखित सामग्री के साथ एक टेक्स्ट फ़ाइल test.txt है:

text1
text2 

और मैं फ़ाइल की सामग्री को UNIX चर में निर्दिष्ट करना चाहता हूं, लेकिन जब मैं ऐसा करता हूं:

testvar=$(cat test.txt)
echo $testvar

परिणाम है:

text1 text2

के बजाय

text1
text2 

क्या कोई मुझे इसके लिए कोई उपाय सुझा सकता है?

जवाबों:


184

असाइनमेंट न्यूलाइन वर्णों को नहीं हटाता है, यह वास्तव में echoऐसा कर रहा है। आपको उन newlines को बनाए रखने के लिए बस स्ट्रिंग के चारों ओर उद्धरण लगाने की आवश्यकता है:

echo "$testvar"

यह wil आपको मनचाहा परिणाम देगा। डेमो के लिए निम्नलिखित प्रतिलेख देखें:

pax> cat num1.txt ; x=$(cat num1.txt)
line 1
line 2

pax> echo $x ; echo '===' ; echo "$x"
line 1 line 2
===
line 1
line 2

नए सिरे से स्पेस के साथ बदले जाने का कारण पूरी तरह से echoकमांड के साथ नहीं है , बल्कि यह चीजों का संयोजन है।

जब एक कमांड लाइन दी bashजाती है , तो इसे IFSचर के लिए प्रलेखन के अनुसार शब्दों में विभाजित किया जाता है :

IFS: आंतरिक क्षेत्र विभाजक जिसका उपयोग विस्तार के बाद शब्द विभाजन के लिए किया जाता है ... डिफ़ॉल्ट मान है <space><tab><newline>

यह निर्दिष्ट करता है कि, डिफ़ॉल्ट रूप से, उन तीन वर्णों में से किसी का उपयोग आपकी कमांड को अलग-अलग शब्दों में विभाजित करने के लिए किया जा सकता है। उसके बाद, शब्द विभाजक चले गए हैं, आपके पास सभी शब्द शेष हैं।

echoप्रलेखन (एक bashआंतरिक कमांड) के साथ संयोजन करें , और आप देखेंगे कि रिक्त स्थान आउटपुट क्यों हैं:

गूंज [-neE] [arg ...]: रिक्त स्थान द्वारा अलग किए गए आर्ग्स को आउटपुट करें, इसके बाद एक नई रेखा।

जब आप उपयोग करते हैं echo "$x", तो यह पूरे xचर को एक शब्द के अनुसार होने के लिए मजबूर करता है bash, इसलिए यह विभाजित नहीं है। आप इसे देख सकते हैं:

pax> function count {
...>    echo $#
...> }
pax> count 1 2 3
3
pax> count a b c d
4
pax> count $x
4
pax> count "$x"
1

यहाँ, countफ़ंक्शन केवल दिए गए तर्कों की संख्या को प्रिंट करता है। 1 2 3और a b c dवेरिएंट इसे कार्य करता हुआ दिखा।

फिर हम इसे xचर पर दो भिन्नताओं के साथ आज़माते हैं । उद्धरण के बिना एक से पता चलता है कि चार शब्द हैं "test",,"1" , "test"और "2"। उद्धरण जोड़ने से यह एक एकल शब्द बन जाता है "test 1\ntest 2"


उद्धरण ... यही मुझे याद आ रहा था! धन्यवाद!
बेनामी

यह भी ध्यान देने योग्य है: ट्रेंडिंग न्यूलाइन्स को कमांड प्रतिस्थापन ऑपरेटर द्वारा स्वयं हटा दिया जाएगा: इसे ऑनलाइन आज़माएं!
योना

11

यह IFS (इंटरनल फील्ड सेपरेटर) वैरिएबल के कारण होता है जिसमें न्यूलाइन होता है।

$ cat xx1
1
2

$ A=`cat xx1`
$ echo $A
1 2

$ echo "|$IFS|"
|       
|

अस्थायी रूप से, नई पंक्ति में IFS को रीसेट न करने के लिए वर्कअराउंड करना है :

$ IFSBAK=$IFS
$ IFS=" "
$ A=`cat xx1` # Can use $() as well
$ echo $A
1
2
$ IFS=$IFSBAK

IFS के लिए इस भयानक परिवर्तन को पुनः प्राप्त करने के लिए:

IFS=$IFSBAK

मैंने यह परिवर्तन किया है, लेकिन अब मेरी अन्य चीजें काम नहीं कर रही हैं कृपया मुझे बताएं कि इसे वापस रीसेट करें?
पूजा २२

यदि आपको किसी वैरिएबल पर जाने के लिए इसकी आवश्यकता नहीं है, तो एक सीधा एक लाइनर:echo "$(IFS=''; cat text.txt)"
कर्टिस येलोप

10

बैश -गेज 4 में एक मानक चर में मानक इनपुट से लाइनों को पढ़ने के लिए मैपफाइल बिलिन है।

help mapfile 

mapfile < file.txt lines
printf "%s" "${lines[@]}"

mapfile -t < file.txt lines    # strip trailing newlines
printf "%s\n" "${lines[@]}" 

यह सभी देखें:

http://bash-hackers.org/wiki/doku.php/commands/builtin/mapfile


3

यदि कोई व्यक्ति किसी अन्य विकल्प में रुचि रखता है:

content=( $(cat test.txt) )

a=0
while [ $a -le ${#content[@]} ]
do
        echo ${content[$a]}
        a=$[a+1]
done

3

आपका चर सही तरीके से सेट है testvar=$(cat test.txt)। इस चर को प्रदर्शित करने के लिए जिसमें नई पंक्ति वर्ण हैं, बस दोहरे उद्धरण चिह्नों को जोड़ते हैं, जैसे

echo "$testvar" 

यहाँ पूरा उदाहरण है:

$ printf "test1\ntest2" > test.txt
$ testvar=$(<test.txt)
$ grep testvar <(set)
testvar=$'test1\ntest2'
$ echo "$testvar"
text1
text2
$ printf "%b" "$testvar"
text1
text2

0

envdirउपयोगिता यह करने के लिए एक आसान तरीका प्रदान करता है। envdirवातावरण चर का प्रतिनिधित्व करने के लिए फ़ाइलों का उपयोग करता है, फ़ाइल नाम मैपिंग के साथ env var नाम, और फ़ाइल सामग्री मैपिंग को env var मान। यदि फ़ाइल सामग्री में newlines हैं, तो env var होगा।

Https://pypi.python.org/pypi/envdir देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.