Cara menambahkan beberapa baris ke file


301

Saya menulis skrip bash untuk mencari file jika tidak ada lalu buat dan tambahkan ini ke dalamnya:

Host localhost
    ForwardAgent yes

Jadi "line then new line 'tab' then text"saya pikir ini format yang sensitif. Saya tahu Anda bisa melakukan ini:

cat temp.txt >> data.txt

Tapi sepertinya aneh karena dua garisnya. Apakah ada cara untuk menambahkannya dalam format ini:

echo "hello" >> greetings.txt

Jawaban:


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

Jika sudo (hak pengguna lain) diperlukan untuk menulis ke file, gunakan ini:

# 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 Itu disebut "dokumen di sini". Lihat paragraf itu di halaman manual.
Hauke ​​Laging

1
Satu kemungkinan lagi adalah ( echo "line 1" ; echo "line 2" ) >>greetings.txt.
ott--

2
@ ott - Anda tidak perlu subkulit nyata (yaitu dapat menyimpan satu proses baru), ini sudah cukup:{ echo "line 1" ; echo "line 2"; } >>greetings.txt
Hauke ​​Laging

2
Apa perbedaan antara EOT dan EOL?
cikatomo

15
@cikatomo Dalam cat <<EOTyang EOThanya string acak. Bisa cat <<FOOjuga begitu.
Hauke ​​Laging

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

Atau, jika itu adalah tab literal yang Anda inginkan (bukan empat spasi dalam pertanyaan Anda):

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

Anda dapat mencapai efek yang sama dengan echo, tetapi seberapa bervariasi dari implementasi ke implementasi, sedangkan printfkonstan.



16

Pendekatan lain adalah menggunakan tee

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

Beberapa baris pilihan dari teehalaman manual:

Utilitas tee menyalin input standar ke output standar, membuat salinan dalam nol atau lebih file.

-a - Menambahkan output ke file daripada menimpa mereka.


6

SED dapat menambahkan baris ke ujung file seperti:

sed -i '$ a text to be inserted' fileName.file
$memilih akhir file, amemberitahu untuk menambahkan, dan setelah ini muncul teks yang akan dimasukkan. Maka tentu saja nama filenya.


Sumber: http://www.yourownlinux.com/2015/04/sed-command-in-linux-append-and-insert-lines-to-file.html

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

Apakah pendekatan ini memiliki manfaat tambahan daripada solusi lain?
Ya, pendekatan ini memiliki manfaat tambahan untuk menambahkan file apa pun yang dikembalikan dalam pencarian, seperti ini: find . -name "*.html" -exec sed -i '$ a </html>' {} \;

Saya menggunakan contoh di atas untuk menyisipkan tag html akhir yang hilang pada setiap halaman html dalam sejumlah direktori.

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


1
Jika Anda akan menunjukkan sintaks untuk menambahkan beberapa baris ke file, maka ini akan menjadi jawaban untuk pertanyaan (meskipun bukan yang sangat berguna). Semua jawaban lain cukup tulis teks baru. Jawaban ini membaca seluruh file dan menulis ulang, ditambah teks yang ditambahkan. Apakah pendekatan ini lebih menguntungkan daripada yang lain?
G-Man

Ini hanya berfungsi dengan GNU sed. BSD sedmenalangi dengan kesalahan: command a expects \ followed by text. Jadi jangan gunakan ini untuk solusi skrip; itu mungkin rusak. (Atau lakukan dengan benar karena sintaks yang diperlukan BSD kompatibel dengan POSIX dan akan bekerja pada GNU sedjuga.
Wildcard

Jawaban yang lain dapat digunakan dengan findsebagai berikut: find . -name "*.txt" -exec sh -c 'printf "%s\n\t%s\n" "Host localhost" "ForwardAgent yes" >> "$1"' sh {} ";".
G-Man

1
Ini adalah solusi yang sangat baik, karena tidak melakukan pengalihan aliran ( >, >>) dan karenanya tidak mengalami masalah seperti menjalankan sudo echo 'something' > /file. Bagi saya itu sempurna memungkinkan untuk menambahkan baris ke file dalam wadah LXD seperti itu: lxc exec c sed -- '$ a newline' /myfile.
Draco Ater

Tidak echo "a new line" >> foo.fileakan membuat baris baru ketika file bukan akhir dari baris baru, tetapi sed -i '$ a a new line' foo.fileakan melakukannya, jadi sedlebih baik terutama Anda ingin selalu menambahkan baris baru ke file.
zhouji

1

Saya menggunakan sed karena dapat digunakan dengan sudo. Sebagai contoh:

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

alternatifnya sangat jelek:

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

dan bahkan lebih jelek bila dilakukan dengan ssh.


1
Mengapa jawaban ini tidak dipilih? Ini sepertinya solusi yang saya butuhkan. Apakah ada masalah dengan itu? Jika tidak, saya akan menggunakannya dan meningkatkannya.
MountainX

Apakah Anda sed -itidak menganggap ekstensi sebagai argumen? Contoh Anda mungkin memiliki parameter yang salah.
protometa

1

Satu liner lainnya adalah:

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

Saya lebih suka -epilihan pemikiran, karena memberi lebih banyak kontrol:

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

1

Seseorang dapat meniru cat >> out.txtdengan Perl atau Python untuk mencapai efek yang sama. Perl:

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

Dan Python:

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

Perhatikan bahwa untuk python Anda harus menekan Ctrl+ Ddua kali. Lihat pertanyaan terkait pada stackoverflow untuk info lebih lanjut.


1

Berikut adalah contoh untuk menambahkan beberapa baris dalam file:

{
        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

Selain jawaban utama, jika file memerlukan izin pengguna super, hanya menambahkan sudodi depan echotidak akan berfungsi.

Ini karena shell merusak perintah dan meskipun echodijalankan sebagai root, tetapi >>dijalankan dengan privilege normal.

Ini akan bekerja untuk pengguna super: sudo su -c "echo 'Line 3' >> greetings.txt"


Anda tidak perlu di susini ( sudo sutidak baik). Tetapi Anda benar bahwa Anda perlu sesuatu untuk mengelola pengalihan shell; mungkin sudo sh -c "echo stuff >> file.txt". Tidak ada penghematan bersih tetapi praktik yang lebih baik.
roaima
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.