2012-06-11 2 views
17

जावा में, यदि आप निश्चित रूप से कह एक फ़ाइल बहुत छोटा है, आप readBytes() विधि का उपयोग कर सकते हैं एक में सामग्री को पढ़ने के लिए जाने के बजाय लाइन या बफर का उपयोग करके लाइन इसे पढ़ा।फ़ाइल सामग्री को एक चर में एक चर में कैसे पढ़ा जाए?

बस खोल स्क्रिप्ट में सोच, मुझे पता है हम की तरह कुछ कर सकते हैं: अगर मेरे test.file की तरह है

while read line 
    do 
     echo $line 
     LINE = $line 
    done < "test.file" 
    echo $LINE 

:

testline1 
testline2 
testline3 

यह केवल मुझे $LINE के अंतिम पंक्ति देता है। $LINE में "testline3" है।

मेरा प्रश्न है: मैं एक एकल चर में कई लाइनों के साथ पूरी फ़ाइल कैसे पढ़ सकते हैं, तो मैं $LINE="testline1\ntestline2\ntestline3" मिल सकता है?

+1

'आंकड़े = $ (बिल्ली फ़ाइल)', लेकिन तुम क्यों करना चाहते हो? जब भी आपको सामग्री चाहिए तो फ़ाइल को बस पढ़ें! –

+1

दो चीजें सीधे आपके प्रश्न से संबंधित नहीं हैं: पहला, 'LINE = $ line' वास्तव में काम नहीं करता है; बराबर चिह्न के आस-पास की जगह इसे अमान्य प्रस्तुत करती है। दूसरा, यदि आप पाठ है कि आप सचमुच सुरक्षित रखना चाहते हैं जोड़ तोड़ रहे हैं, आप 'अशक्त करने के लिए IFS' अपने पढ़ने कॉल (अन्यथा अग्रणी प्रत्येक पंक्ति nuked हो जाएगा पर खाली स्थान के) के लिए सेट और' read' को '-r' विकल्प पास करना चाहिए और 'eE' विकल्प 'echo' (अन्यथा, आपकी फ़ाइल में कोई बैकस्लैश गड़बड़ कर देगा)। उदाहरण के लिए नीचे मेरा जवाब देखें। –

+0

@ मार्ककिड: मैंने 'ईई' के उद्देश्य से बैश के डिफ़ॉल्ट व्यवहार के बाद से '-E' के उद्देश्य को कभी नहीं समझा है। –

उत्तर

56

प्रक्रिया पाश अंदर के बजाय इसे बाद लाइनों। यदि आपको वास्तव में एक चर में फ़ाइल की आवश्यकता है:

var=$(<file) 
+0

क्या आप यह भी समझा सकते हैं कि यहां क्या हो रहा है? – sbhatla

+2

@shhatla: वेरिएबल कमांड प्रतिस्थापन के मान पर सेट है जिसमें एक रीडायरेक्ट होता है जो फ़ाइल की सामग्री को पढ़ता है। यह 'var = $ (बिल्ली फ़ाइल) 'के समान है, लेकिन इसे बाहरी निष्पादन योग्य बनाने की आवश्यकता नहीं है)। –

8

एक और विकल्प के रूप में, आप लाइनों की एक सरणी बना सकते हैं। आप बैश 4 चला रहे हैं, तो आप mapfile निर्मित उपयोग कर सकते हैं: फिर

mapfile -t lines < <(tee /dev/tty <test.file) 

:

mapfile -t lines <test.file 

आप लाइनों के रूप में जमा आप कुछ इस तरह कर सकता है और साथ ही उत्पादन होना चाहते हैं "${lines[0]}" फ़ाइल की पहली पंक्ति होगी, "${lines[1]}" दूसरा, और इसी तरह। ${#lines[@]} लाइनों की संख्या होगी; "${lines[@]}", पूरे सरणी होना जबकि "${lines[*]}" लाइनों एक बड़ा स्ट्रिंग में रिक्त स्थान के साथ एक साथ शामिल हो गए होंगे।

बैश के पुराने संस्करणों के लिए

, आप सरणी मैन्युअल निर्माण कर सकते हैं:

lines=() 
while IFS= read -r line 
do 
    printf '%s\n' "$line" 
    lines+=("$line") 
done < test.file 
+1

यह 'LINES + = ("$ line") के रूप में आसान लिखा जाएगा, है ना? –

+0

यूप। मैंने 4 साल में थोड़ा सी सीखा है, ऐसा लगता है। जानकार अच्छा लगा।:) –

+0

मुझे इसे दूसरे के लिए संदेह नहीं है :) –

10

एक अन्य विकल्प अच्छा mapfile निर्मित उपयोग करने के लिए है:

mapfile < test.file 
echo "${MAPFILE[@]}" 
+2

इसके लिए कोई मैन पेज नहीं है, लेकिन 'मैपफ़ाइल सहायता' कुछ और जानकारी देगा। उपयोगिता डिफ़ॉल्ट रूप से प्रविष्टि 0 में पहली पंक्ति डालती है, प्रविष्टि 1 में दूसरी पंक्ति, और इसी तरह। आप शायद इसे '-t' विकल्प (स्ट्रिप न्यूलाइन) के साथ भी उपयोग करना चाहते हैं। – parvus

+1

ध्यान दें कि बैश 4 में 'मैपफ़ाइल' पेश किया गया था, इसलिए ओएस एक्स पर '/ bin/bash' में अनुपलब्ध है। संभवतः जंगली में होने वाली संभावित 3 बैश का अंतिम गढ़ है, लेकिन अपडेट होने की संभावना भी नहीं है ऐप्पल और नए जीपीएल के साथ लाइसेंसिंग चिंताओं के कारण। –

+1

जब ऐप्पल मैक ओएस से मैकोज़ में अपडेट किया गया, तो बैश 4.4 शामिल किया गया था। – DopeGhoti