Bagaimana cara menambahkan teks ke file?

109

Apa cara termudah untuk menambahkan teks ke file di Linux?

Saya telah melihat pertanyaan ini , tetapi jawaban yang diterima menggunakan program tambahan ( sed) Saya yakin seharusnya ada cara yang lebih mudah dengan echoatau serupa.

Dchris
sumber

Jawaban:

125
cat >> filename
This is text, perhaps pasted in from some other source.
Or else entered at the keyboard, doesn't matter. 
^D

Pada dasarnya, Anda dapat membuang teks apa pun yang Anda inginkan ke dalam file. CTRL-D mengirimkan sinyal akhir file, yang menghentikan input dan mengembalikan Anda ke shell.

Jon Kiparsky
sumber
2
Bagaimana saya bisa melakukan ini ketika file membutuhkan izin root?
UselesssCat
2
@UselesssCat ketika sesuatu berjalan "izin ditolak", saya memeriksa ulang perintah apa pun yang saya jalankan dan kemudian gunakan sudo !!- yang mengeksekusi perintah terakhir dengan sudoprepended. Saya baru-baru ini menemukan ini juga bekerja dengan nanodll (dengan tidak sengaja mencoba nano nano auth...)
Sandra
jika Anda perlu menggunakan sudo atau menggunakan ini dalam skrip, lihat tindak lanjut saya untuk jawaban yang diterima di bawah ini.
pengguna12345
4
Saya tidak tahu kucing bisa digunakan seperti ini! Seperti menulis entri jurnal. Juga tidak tahu tentang apa yang dilakukan ctrl-d. Terima kasih!
houallet
1
@ Sandra - Tidak pernah digunakan !!sebelumnya, luar biasa. Begitu sering saya melakukan hal-hal seperti cat /var/log/apache/error.logdan mendapat izin ditolak. Ini juga bisa dilakukan dengan id dari history misalnya sudo !1419, ini akan menjalankan perintah pada baris 1419dalam history sebagai sudo.
Cyclonecode
172

Bagaimana tentang:

echo "hello" >> <filename>

Menggunakan >>operator akan menambahkan data di akhir file, sedangkan menggunakan >akan menimpa konten file jika sudah ada.

Anda juga bisa menggunakan printfdengan cara yang sama:

printf "hello" >> <filename>

Perhatikan bahwa penggunaan di atas bisa berbahaya. Misalnya jika Anda sudah memiliki file dan Anda perlu menambahkan data ke akhir file dan Anda lupa menambahkan terakhir >semua data di file akan dimusnahkan. Anda dapat mengubah perilaku ini dengan menyetel noclobbervariabel di .bashrc:

set -o noclobber

Sekarang ketika Anda mencoba melakukannya, echo "hello" > file.txtAnda akan mendapatkan peringatan yang mengatakan cannot overwrite existing file.

Untuk memaksa penulisan ke file, Anda sekarang harus menggunakan sintaks khusus:

echo "hello" >| <filename>

Anda juga harus tahu bahwa secara default echomenambahkan karakter baris baru yang dapat disembunyikan dengan menggunakan -nbendera:

echo -n "hello" >> <filename>

Referensi

Kode siklon
sumber
4
Secara umum, saya menyukai ini lebih dari jawaban yang diterima yang digunakan cat, tetapi Anda sebaiknya berhati-hati dalam memastikan untuk menggunakan >>daripada >!
sixty4bit
@ sixty4bit - Sangat setuju, tapi saya pikir Anda selalu harus tahu apa yang Anda lakukan saat bekerja dengan shell atau Anda mungkin melakukan sesuatu seperti sudo rm -r /=)
Cyclonecode
1
lebih baik sudo rm -r /dari sudo rm -rf /! ^ _ ^ Apakah ada flag yang akan meminta konfirmasi sebelum menimpa konten file yang sudah ada >? Mengasali bahwa untuk selalu menggunakan bendera seperti itu sepertinya itu ide yang bagus.
sixty4bit
2
@ sixty4bit - Anda dapat menambahkan set -o noclobberAnda .bashrcsehingga Anda tidak dapat menimpa file yang ada tanpa menggunakan sintaks khususecho "hello" >| <filename>
Cyclonecode
dapatkah Anda memberikan contoh di mana file tersebut dipanggil, katakan "myFile.txt" atau sesuatu? Saya tidak yakin apakah itu <filename> atau nama file dalam contoh Anda
bharal
24

Cara lain yang mungkin adalah:

echo "text" | tee -a filename >/dev/null

Ini -aakan ditambahkan di akhir file.

Jika perlu sudo, gunakan:

echo "text" | sudo tee -a filename >/dev/null
pengguna9869932
sumber
Mengapa> / dev / null di akhir?
Quadrivium
1
Di >/dev/nullbagian akhir mencegah "teks" untuk ditampilkan di konsol Anda.
pengguna9869932
13

Tindak lanjuti untuk jawaban yang diterima.

Anda memerlukan sesuatu selain CTRL-D untuk menentukan akhir jika menggunakan ini dalam skrip . Coba ini sebagai gantinya:

cat << EOF >> filename
This is text entered via the keyboard or via a script.
EOF

Ini akan menambahkan teks ke file yang disebutkan (tidak termasuk "EOF").

Ini menggunakan dokumen di sini (atau heredoc) .

Namun jika Anda membutuhkan sudo untuk menambahkan file yang disebutkan, Anda akan mengalami masalah dalam menggunakan heredoc karena pengalihan I / O jika Anda mengetik langsung di baris perintah.

Variasi ini akan berfungsi saat Anda mengetik langsung di baris perintah:

sudo sh -c 'cat << EOF >> filename
This is text entered via the keyboard.
EOF'

Atau Anda dapat menggunakan teesebagai gantinya untuk menghindari masalah sudo baris perintah yang terlihat saat menggunakan heredoc dengan cat:

tee -a filename << EOF
This is text entered via the keyboard or via a script.
EOF
pengguna12345
sumber
Saya telah menggunakan cat << 'EOF' >selama bertahun-tahun dan tidak tahu tentang cat << 'EOF' >>menambahkan! Terima kasih
FreeSoftwareServers