किसी फ़ाइल में कई लाइनें कैसे जोड़ें


301

मैं किसी फ़ाइल को देखने के लिए एक bash स्क्रिप्ट लिख रहा हूं यदि वह मौजूद नहीं है तो इसे बनाएं और इसे इसमें जोड़ें:

Host localhost
    ForwardAgent yes

इसलिए "line then new line 'tab' then text"मुझे लगता है कि इसका संवेदनशील प्रारूप है। मुझे पता है आप ऐसा कर सकते हैं:

cat temp.txt >> data.txt

लेकिन इसकी दो पंक्तियों के बाद से यह अजीब लगता है। क्या इस प्रारूप में इसे जोड़ने का कोई तरीका है:

echo "hello" >> greetings.txt

जवाबों:


526
# possibility 1:
echo "line 1" >> greetings.txt
echo "line 2" >> greetings.txt

# possibility 2:
echo "line 1
line 2" >> greetings.txt

# possibility 3:
cat <<EOT >> greetings.txt
line 1
line 2
EOT

अगर sudo (अन्य उपयोगकर्ता विशेषाधिकार) को फ़ाइल में लिखना आवश्यक है, तो इसका उपयोग करें:

# possibility 1:
echo "line 1" | sudo tee -a greetings.txt > /dev/null

# possibility 3:
sudo tee -a greetings.txt > /dev/null <<EOT
line 1
line 2
EOT

2
@ TheLegend जिसे "यहाँ दस्तावेज़" कहा जाता है। मैन पेज में उस पैराग्राफ पर एक नज़र डालें।
हक लेजिंग

1
एक और संभावना है ( echo "line 1" ; echo "line 2" ) >>greetings.txt
ott--

2
@ ott-- आपको एक वास्तविक उपधारा की आवश्यकता नहीं है (यानी एक नई प्रक्रिया को बचा सकते हैं), यह पर्याप्त है:{ echo "line 1" ; echo "line 2"; } >>greetings.txt
Hauke ​​Laging

2
EOT और EOL के बीच अंतर क्या है?
cikatomo

15
@cikatomo में सिर्फ एक यादृच्छिक स्ट्रिंग है। भी हो सकता है। cat <<EOTEOTcat <<FOO
हौके लाजिंग

60
printf '%s\n    %s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt

या, यदि यह एक शाब्दिक टैब है जो आप चाहते हैं (आपके प्रश्न में चार स्थानों के बजाय):

printf '%s\n\t%s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt

आप उसी प्रभाव को प्राप्त कर सकते हैं echo, लेकिन वास्तव में कार्यान्वयन से कार्यान्वयन तक कैसे भिन्न होता है, जबकि printfस्थिर है।



16

एक और दृष्टिकोण का उपयोग करना है tee

tee -a ~/.ssh/config << END
Host localhost
  ForwardAgent yes
END

कुछ विकल्प लाइनों के teeआदमी पृष्ठ से:

टी उपयोगिता उपयोगिता मानक आउटपुट के लिए मानक इनपुट की नकल करती है, जो शून्य या अधिक फ़ाइलों में प्रतिलिपि बनाती है।

-a - फ़ाइलों को अधिलेखित करने के बजाय आउटपुट को उन पर लिखें।


6

SED किसी फ़ाइल के अंत में एक पंक्ति को जोड़ सकता है जैसे: फ़ाइल

sed -i '$ a text to be inserted' fileName.file
$का अंत चुनता है, aइसे बताता है, और इसके बाद पाठ आता है जिसे सम्मिलित किया जाना है। फिर निश्चित रूप से फ़ाइल का नाम।


स्रोत: http://www.yourownlinux.com/2015/04/sed-command-in-linux-append-and-insert-lines-to-file.html

========== EDIT == ==========

क्या इस दृष्टिकोण का अन्य समाधानों की तुलना में कोई अतिरिक्त लाभ है?
हां, इस दृष्टिकोण का किसी खोज में किसी भी फाइल में संलग्न होने का अतिरिक्त लाभ है, जैसे कि: find . -name "*.html" -exec sed -i '$ a </html>' {} \;

मैंने ऊपर दिए गए HTML टैग को सम्मिलित करने के लिए उपरोक्त उदाहरण का उपयोग किया था जो कि प्रत्येक HTML पृष्ठ पर कई निर्देशिकाओं में गायब था।

===================================


1
यदि आप एक फ़ाइल में कई लाइनों को जोड़ने के लिए वाक्यविन्यास दिखाते हैं, तो यह प्रश्न का उत्तर होगा (हालांकि यह बहुत उपयोगी नहीं है)। अन्य सभी उत्तर बस नया पाठ लिखते हैं। यह उत्तर संपूर्ण फ़ाइल को पढ़ता है और इसे फिर से लिखता है, साथ ही अतिरिक्त पाठ। क्या इस दृष्टिकोण का दूसरों पर कोई लाभ है?
जी-मैन

यह केवल GNU के साथ काम करता है sed। बीएसडी sedत्रुटि के साथ bails: command a expects \ followed by text। तो एक पटकथा समाधान के लिए इसका इस्तेमाल नहीं करते; यह तोड़ने के लिए उत्तरदायी है। (या इसे ठीक से करें क्योंकि BSD आवश्यक सिंटैक्स POSIX संगत है और GNU पर भी काम करेगा sed
Wildcard

अन्य उत्तरों findको निम्नानुसार इस्तेमाल किया जा सकता है find . -name "*.txt" -exec sh -c 'printf "%s\n\t%s\n" "Host localhost" "ForwardAgent yes" >> "$1"' sh {} ";":।
G-Man

1
यह एक बहुत ही अच्छा समाधान है, यह धारा पुनर्निर्देशन (ऐसा नहीं करता है के रूप में >, >>इस तरह के चल रहा है के रूप में अपनी समस्याओं से ग्रस्त नहीं है) और इस तरह sudo echo 'something' > /file। मेरे लिए यह पूरी तरह से lxd कंटेनर में एक फ़ाइल के लिए एक लाइन संलग्न करने की अनुमति देता है जैसे lxc exec c sed -- '$ a newline' /myfile:।
ड्रेको एटर

echo "a new line" >> foo.fileएक नई लाइन जब फाइल नई लाइन का अंत नहीं है, लेकिन नहीं बनाएगा sed -i '$ a a new line' foo.fileकरेंगे, तो sedविशेष रूप से आप हमेशा फाइल करने के लिए एक नई लाइन संलग्न करना चाहते हैं बेहतर है।
झोजी

1

मैंने sed का उपयोग किया क्योंकि इसे sudo के साथ प्रयोग किया जा सकता है। उदाहरण के लिए:

sudo sed -i '$ a text to be inserted' fileName.file 

विकल्प बहुत बदसूरत है जैसे:

sudo bash -c "echo a text to be inserted >> fileName.file"  

और भी बदसूरत जब ssh के साथ किया।


1
यह जवाब क्यों दिया गया? यह उस समाधान की तरह दिखता है जिसकी मुझे आवश्यकता है। क्या इसमें कोई समस्या है? यदि नहीं, तो मैं इसका इस्तेमाल करूंगा और इसे बढ़ाऊंगा।
MountainX

क्या आपके sed -iतर्क के रूप में विस्तार नहीं होता है? आपके उदाहरण में गलत पैरामीटर हो सकते हैं।
प्रोटोमेटा

1

एक अन्य लाइनर है:

echo "Greetings 1" >> greetings.txt && echo "Greetings 2" >> greetings.txt

मैं -eविकल्प पर विचार करना पसंद करूंगा , क्योंकि यह अधिक नियंत्रण देता है:

echo -e "Greeting 1\nGreetings 2\n" >> greetings.txt

1

एक cat >> out.txtही प्रभाव को प्राप्त करने के लिए या तो पर्ल या पायथन के साथ अनुकरण कर सकते हैं । पर्ल:

perl -e 'open(fh,">>","./out.txt");while(<>){printf(fh "%s",$_)};close(fh);'

और अजगर:

python -c 'import sys;f=open(sys.argv[1],"a");l=[i for i in sys.stdin];f.write("".join(l))' out.txt 

ध्यान दें कि अजगर के लिए आपको दो बार हिट Ctrl+ करना होगा D। अधिक जानकारी के लिए stackoverflow पर संबंधित प्रश्न देखें ।


1

यहाँ एक फ़ाइल में कई लाइनों को जोड़ने के लिए एक उदाहरण दिया गया है:

{
        echo '  directory "/var/cache/bind";'
        echo '  listen-on { 127.0.0.1; };'
        echo '  listen-on-v6 { none; };'
        echo '  version "";'
        echo '  auth-nxdomain no;'
        echo '  forward only;'  
        echo '  forwarders { 8.8.8.8; 8.8.4.4; };'
        echo '  dnssec-enable no;'
        echo '  dnssec-validation no;'
} >> your_file.txt

0

मुख्य जवाब के अलावा, मामले में फ़ाइल सुपर उपयोगकर्ता अनुमतियों की आवश्यकता है, बस जोड़ने sudoके सामने echoकाम नहीं करेगा।

ऐसा इसलिए है क्योंकि शेल कमांड को तोड़ता है और हालांकि echoरूट के रूप में >>चलता है , लेकिन सामान्य विशेषाधिकार के साथ चलता है।

यह सुपर यूजर के लिए काम करेगा: sudo su -c "echo 'Line 3' >> greetings.txt"


आपको suयहाँ की आवश्यकता नहीं है ( sudo suअच्छा नहीं है)। लेकिन आप सही हैं कि आपको शेल पुनर्निर्देशन का प्रबंधन करने की आवश्यकता है; शायद sudo sh -c "echo stuff >> file.txt"। कोई नेट सेविंग नहीं बल्कि एक बेहतर प्रैक्टिस।
रोइमा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.