बैश का उपयोग करके टेक्स्ट फ़ाइल में डेटा खोलें और लिखें?


247

मैं लिनक्स में शेल स्क्रिप्टिंग द्वारा स्वचालित रूप से पाठ फ़ाइल में डेटा कैसे लिख सकता हूं?

मैं फ़ाइल खोलने में सक्षम था। हालाँकि, मुझे नहीं पता कि इसे कैसे लिखना है।

जवाबों:


410
echo "some data for the file" >> fileName

7
इस ऑपरेटर का नाम क्या है? मैं इसके बारे में एक मैनुअल खोजना चाहता हूं।
व्लाद टी।

96
ऑपरेटर> फाइल में आउटपुट को रीडायरेक्ट करता है अगर कोई मौजूद है तो फाइल को ओवरराइट कर देता है। >> एक मौजूदा फ़ाइल में संलग्न होगा।
ट्राइटन मैन

4
धन्यवाद, यहाँ विकी पेज का लिंक दिया गया है, अगर किसी को इसकी आवश्यकता है तो en.wikipedia.org/wiki/…
व्लाद टी।

11
यदि आपको रूट विशेषाधिकारों के साथ ऐसा करने की आवश्यकता है, तो इसे इस तरह से करें:sudo sh -c 'echo "some data for the file" >> fileName'
3:15 पर lukaserat

1
अपने पाठ की तरह कुछ क्या है अगर यह किसी भी कारण से, मैं उपयोग नहीं कर सकते curlया wget?
अष्टमी तिथि

145
#!/bin/sh

FILE="/path/to/file"

/bin/cat <<EOM >$FILE
text1
text2 # This comment will be inside of the file.
The keyword EOM can be any text, but it must start the line and be alone.
 EOM # This will be also inside of the file, see the space in front of EOM.
EOM # No comments and spaces around here, or it will not work.
text4 
EOM

1
मल्टीलाइन आउटपुट पर अच्छा लगा।
फेडेरिको ज़ांकन

8
Newbies को इस फ़ाइल के साथ क्या करना है, यह जानने से लाभ होगा। इसे कैसे बचाया जाए, इसे कैसे चलाया जाए आदि
डैनी

14
कृपया केवल कोड का एक टुकड़ा लगाने के बजाय स्पष्ट करें। यह हर किसी के लिए इतना अधिक उपयोगी बना देगा - विशेष रूप से newbies।
कैस्पर बी हेंसन

2
इस मामले में $ some_var जैसे चरों के साथ स्क्रिप्ट खो जाती है। इसका समाधान कैसे किया जा सकता है?
अर्तुबका


60

आप किसी फ़ाइल में कमांड के आउटपुट को रीडायरेक्ट कर सकते हैं:

$ cat file > copy_file

या इसे संलग्न करें

$ cat file >> copy_file

यदि आप सीधे लिखना चाहते हैं तो कमांड है echo 'text'

$ echo 'Hello World' > file

3
यदि आपको रूट अनुमति की आवश्यकता है: sudo sh -c 'cat file > /etc/init/gunicorn.conf'(उपरोक्त लुकसेरट की टिप्पणी के लिए धन्यवाद)
एयरो

46
#!/bin/bash

cat > FILE.txt <<EOF

info code info 
info code info
info code info

EOF 

38
आपके कोड का स्पष्टीकरण दूसरों को अधिक उपयोगी बनाने की दिशा में एक लंबा रास्ता तय करेगा। यहां तक ​​कि "यहाँ दस्तावेज़" और "पुनर्निर्देशन" जैसी शब्दावली के कॉलआउट अन्य संसाधनों के लिए खोजकर्ताओं को इंगित कर सकते हैं।
पलपीम

2
इस तरह से कुछ के लिए स्पष्टीकरण आवश्यक नहीं है।
भार्गव नानकेलवा

6
जब आप पहले से ही उत्तर जानते हैं तो स्पष्टीकरण कभी भी आवश्यक नहीं है। मेरे पास उपरोक्त कोड विवरण की कमी के कारण सहायक नहीं है।
सूरेन उलीदत्त


1
EOF के बाद - कोई स्थान नहीं होना चाहिए।
atрий Светлов

24

मुझे पता है कि यह एक बहुत पुराना सवाल है, लेकिन जैसा कि ओपी स्क्रिप्टिंग के बारे में है, और इस तथ्य के लिए कि Google मुझे यहां लाया है, उसी समय पढ़ने और लिखने के लिए फ़ाइल डिस्क्रिप्टर खोलने का भी उल्लेख किया जाना चाहिए।

#!/bin/bash

# Open file descriptor (fd) 3 for read/write on a text file.
exec 3<> poem.txt

    # Let's print some text to fd 3
    echo "Roses are red" >&3
    echo "Violets are blue" >&3
    echo "Poems are cute" >&3
    echo "And so are you" >&3

# Close fd 3
exec 3>&-

फिर catटर्मिनल पर फ़ाइल

$ cat poem.txt
Roses are red
Violets are blue
Poems are cute
And so are you

यह उदाहरण फ़ाइल poem.txt का कारण बनता है, जो फ़ाइल डिस्क्रिप्टर 3 पर पढ़ने और लिखने के लिए खुला रहता है। यह यह भी दर्शाता है कि * nix बक्से को अधिक fd का पता है, फिर स्टडआउट, stdout और stderr (fd 0,1,2)। यह वास्तव में बहुत कुछ रखती है। आमतौर पर कर्नेल को आवंटित किए जा सकने वाले फ़ाइल डिस्क्रिप्टर की अधिकतम संख्या में पाया जा सकता है /proc/sys/file-maxया /proc/sys/fs/file-max9 से ऊपर किसी भी fd का उपयोग करना खतरनाक है क्योंकि यह आंतरिक रूप से शेल द्वारा उपयोग किए जाने वाले fd के साथ संघर्ष कर सकता है। तो परेशान न हों और केवल fd के 0-9 का उपयोग करें। यदि आपको एक bash स्क्रिप्ट में 9 फ़ाइल डिस्क्रिप्टर की अधिक आवश्यकता है, तो आपको किसी अन्य भाषा का उपयोग करना चाहिए :)

किसी भी तरह, एफडी का उपयोग कई दिलचस्प तरीकों से किया जा सकता है।


14

मुझे यह उत्तर पसंद है:

cat > FILE.txt <<EOF

info code info 
...
EOF

लेकिन सुझाव है कि cat >> FILE.txt << EOFयदि आप चाहते हैं कि फ़ाइल के अंत में कुछ मिटाए बिना जो पहले से मौजूद है, उसे मिटाए बिना

ऐशे ही:

cat >> FILE.txt <<EOF

info code info 
...
EOF

1
जवाब के साथ कुछ स्पष्टीकरण जोड़ें कि यह उत्तर ओपी को वर्तमान मुद्दे को ठीक करने में कैसे मदद करता है
ρяєρ withя K

9

एक उत्तर के रूप में मेरी टिप्पणी को आगे बढ़ाते हुए, @lycono द्वारा अनुरोध किया गया

यदि आपको रूट विशेषाधिकारों के साथ ऐसा करने की आवश्यकता है, तो इसे इस तरह से करें:

sudo sh -c 'echo "some data for the file" >> fileName'

6
आप केवल स्ट्रिंग को प्रिंट करने के लिए रूट शेल चलाने से बचना चाहते हैं। echo "some data for the file" | sudo tee -a fileName >/dev/nullकेवल teeजड़ के रूप में चलाने की कोशिश करें ।
ट्रिपल जूल

6

उन परिवेशों के लिए जहां दस्तावेज़ उपलब्ध नहीं हैं ( Makefileऔर Dockerfile, आदि) आप अक्सर printfएक उचित और कुशल समाधान के लिए उपयोग कर सकते हैं।

printf '%s\n' '#!/bin/sh' '# Second line' \
    '# Third line' \
    '# Conveniently mix single and double quotes, too' \
    "# Generated $(date)" \
    '# ^ the date command executes when the file is generated' \
    'for file in *; do' \
    '    echo "Found $file"' \
    'done' >outputfile

1
ऊपर आपकी टिप्पणी की कोशिश करो "फ़ाइल के लिए कुछ डेटा" गूंज sudo tee -a fileName> / dev / null केवल टी को रूट के रूप में चलाने के लिए। वास्तव में उपयोगी था!
कोजो

5

मैंने सोचा था कि कुछ पूरी तरह से ठीक जवाब थे, लेकिन सभी संभावनाओं का कोई संक्षिप्त सारांश नहीं; इस प्रकार:

यहां अधिकांश उत्तरों के पीछे मूल प्रमुख पुनर्निर्देशन है । फ़ाइलों को लिखने के लिए दो महत्वपूर्ण पुनर्निर्देशन ऑपरेटर हैं:

पुनर्निर्देशन आउटपुट:

echo 'text to completely overwrite contents of myfile' > myfile

पुनर्निर्देशित आउटपुट लागू करना

echo 'text to add to end of myfile' >> myfile

यहाँ दस्तावेज़

अन्य लोगों ने उल्लेख किया, जैसे कि एक निश्चित इनपुट स्रोत से echo 'text', आप एक इंटरएक्टिव फाइल को "हियर डॉक्यूमेंट" के माध्यम से लिख सकते हैं, जो ऊपर दिए गए बैश मैनुअल के लिंक में भी विस्तृत हैं। वे जवाब, जैसे

cat > FILE.txt <<EOF या cat >> FILE.txt <<EOF

एक ही पुनर्निर्देशन ऑपरेटरों का उपयोग करें, लेकिन "यहां दस्तावेज़" के माध्यम से एक और परत जोड़ें। उपरोक्त सिंटैक्स में, आप FILE.txt को आउटपुट के माध्यम से लिखते हैं cat। इंटरएक्टिव इनपुट कुछ विशिष्ट स्ट्रिंग दिए जाने के बाद ही लेखन होता है, इस मामले में 'EOF', लेकिन यह कोई भी स्ट्रिंग हो सकता है, जैसे:

cat > FILE.txt <<'StopEverything' या cat >> FILE.txt <<'StopEverything'

साथ ही काम करेगा। यहां दस्तावेज़ विभिन्न सीमांकक और अन्य दिलचस्प पार्सिंग पात्रों की तलाश करते हैं, इसलिए उस पर आगे की जानकारी के लिए डॉक्स पर एक नज़र डालें।

यहाँ स्ट्रिंग्स

थोड़ा पुनर्निर्धारित, और रीडायरेक्शन और यहाँ दस्तावेज़ दस्तावेज़ सिंटैक्स दोनों को समझने में अधिक अभ्यास, लेकिन आप यहाँ स्ट्रिंग के बनने के लिए मानक रीडायरेक्ट ऑपरेटरों के साथ दस्तावेज़ शैली सिंटैक्स को जोड़ सकते हैं:

बिल्ली इनपुट का पुनर्निर्देशन आउटपुट

cat > myfile <<<'text to completely overwrite contents of myfile'

बिल्ली इनपुट के पुनर्निर्देशित आउटपुट को लागू करना

cat >> myfile <<<'text to completely overwrite contents of myfile'


0

यहां दस्तावेज़ और vi का भी उपयोग किया जा सकता है, नीचे दी गई स्क्रिप्ट 3 लाइनों और चर प्रक्षेप के साथ एक FILE.txt उत्पन्न करती है

VAR=Test
vi FILE.txt <<EOFXX
i
#This is my var in text file
var = $VAR
#Thats end of text file
^[
ZZ
EOFXX

फिर फ़ाइल में नीचे 3 लाइनें होंगी। "मैं" vi आवेषण मोड शुरू करने के लिए है और इसी तरह Esc और ZZ के साथ फाइल को बंद करने के लिए है।

#This is my var in text file
var = Test
#Thats end of text file

0

यह मेरा जवाब है। $ बिल्ली फ़ाइल> copy_file


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