Menambahkan baris ke file di perintah cat?

11

Saya bisa lakukan cat file.txtuntuk mendapatkan isi file tetapi saya juga ingin memakukan pada baris terakhir yang saya pilih.

Saya mencoba perpipaan (cat file.txt ; echo "My final line") |tetapi hanya garis terakhir yang melewati pipa. Bagaimana saya bisa bergabung dengan kucing dan garis akhir?

Sunting untuk klarifikasi: Saya tidak ingin memodifikasi file itu sendiri. Saya sadar bahwa jika ini adalah kasus yang dapat saya lakukan echo "My final line" >> file.txtatau echo "My final line" | tee -a file.txttetapi saya hanya mencoba untuk melakukan penambahan dalam konteks perintah khusus ini sehingga saya dapat menyambungkan dalam rangkaian dari file.txtdan "My final line".

Bas
sumber
1
Mungkin kira-kira seperti itu echo "My final line" >> file.txt?
edwinksl
Saya tidak ingin benar-benar menambahkan baris ke objek file, hanya di perintah / perpipaan. Saya sudah tahu bahwa saya dapat menambahkan baris >>jika saya ingin mengedit file itu sendiri.
DoubleBass
11
Apakah Anda tidak sengaja terhapus file.txt? Cuplikan pipa Anda harusnya berfungsi.
Bracken
@DoubleBass: Jawaban Mathieu Mitchell adalah jawaban yang lebih baik, karena tidak memodifikasi file (baik dalam memori atau pada disk), tetapi menggunakan fitur perintah built-in.
Bryan Boettcher

Jawaban:

30

Anda dapat meningkatkan catkemampuan membaca dari stdin yang dikombinasikan dengan kemampuannya untuk membaca banyak file untuk mencapai ini.

~$ cat file.txt
Hello from file.txt

~$ echo "My final line" | cat file.txt -
Hello from file.txt
My final line

Anda juga dapat menambahkan sebuah baris, seperti:

~$ echo "My final line" | cat - file.txt
My final line
Hello from file.txt

Perhatikan bahwa Anda tidak terbatas pada satu baris. catakan membaca dari stdin hingga mencapai EOF. Anda dapat melewatkan output dari curl, misalnya, untuk menambahkan atau menambahkan ke output dari cat.

~$ curl -s http://perdu.com | cat file.txt -
Hello from file.txt
<html><head><title>Vous Etes Perdu ?</title></head><body><h1>Perdu sur l'Internet ?</h1><h2>Pas de panique, on va vous aider</h2><strong><pre>    * <----- vous &ecirc;tes ici</pre></strong></body></html>
Mathieu Mitchell
sumber
1
(cat file.txt ; echo "My final line") | …akan melakukannya juga. Tetapi menggunakan catuntuk apa itu dirancang +1 lebih baik.
ctrl-alt-delor
@ ctrl-alt-delor: Sub-shells juga memiliki kelemahan dari proses tambahan untuk garpu yang relatif mahal. Coba misalnya echo "$$" "$BASHPID" | head -q -n 1 /proc/mounts - | catvs. ( head -q -n 1 /proc/mounts; echo "$$" "$BASHPID" ) | catatau bahkan { head -q -n 1 /proc/mounts; echo "$$" "$BASHPID"; } | cat.
David Foerster
11

Untuk menambahkan baris ke file, Anda bisa menggunakan operator pengalihan shell append, >>(file akan open(2)ditandai dengan O_APPENDflag):

echo 'My final line' >>file.txt

Sekarang, jika Anda hanya ingin melihat konten file dengan baris akhir ditambahkan, saya akan gunakan catdengan dua argumen:

  • Pertama, file Anda jelas, katakanlah file.txt
  • Argumen kedua adalah string pilihan Anda, dan untuk meneruskan string sebagai nama file (karena cathanya berurusan dengan file), Anda dapat memanfaatkan subtitusi proses <(), yang akan mengembalikan deskriptor file ( /proc/self/fd/<fd_number>).

Menyatukan ini:

cat file.txt <(echo 'My final line')

Jika Anda ingin hasil paging, anggap lesspager favorit Anda:

less file.txt <(echo 'My final line')
heemayl
sumber
<()berfungsi untuk bash, tetapi untuk apa cangkang lain berfungsi? Ksh? Berlari?
jpaugh
1
@jpaugh ksh, zsh- Ya, dash- Tidak.
heemayl
Ini memodifikasi yang asli.
ctrl-alt-delor
11
sed -e '$aMy final line' file.txt

Dari man sedopsi-e

-e script, --expression=script
    add the script to the commands to be executed

$cocok dengan baris terakhir dan amenambahkan string.

Jika Anda ingin menambahkan baris ke file secara permanen, gunakan -i

-i[SUFFIX], --in-place[=SUFFIX]
    edit files in place (makes backup if SUFFIX supplied)

Mengubah perintah menjadi

sed -i -e '$aMy final line' file.txt
Katu
sumber
1
Gunakan tanda kutip tunggal dan Anda tidak perlu garis miring terbalik.
Wildcard
7

Itu sudah diklarifikasi dalam komentar untuk pertanyaan, tetapi menambahkannya lagi sebagai jawaban di sini.

Perintah yang disebutkan dalam pertanyaan,

(cat file.txt ; echo "My final line") | other command

berfungsi seperti yang diharapkan - semua output dari subkulit yang dibentuk oleh tanda kurung disalurkan ke perintah kedua.

Jika file tidak diakhiri dengan baris baru, string yang digaungkan ditambahkan ke baris terakhir - ini biasa terjadi pada semua solusi lain di sini, dan dapat diselesaikan dengan menambahkan gema (kosong) sebelumnya.

Paŭlo Ebermann
sumber
1
Jika file tidak berakhir dengan baris baru, saya akan menggunakan awk: awk 1 file.txt; echo "My final line". awk 1 fileadalah trik yang bagus untuk mengkompensasi hilangnya EOL di akhir file.
muru
Jika file tidak diakhiri dengan baris baru, Anda juga dapat menggunakan saja echo "\nMy final line"tanpa harus bergantung padaawk
1919