Bagaimana cara saya menyisipkan baris di bagian atas file teks menggunakan baris perintah?

25

Saya ingin memasukkan teks di bagian atas file yang sudah ada. Bagaimana saya bisa mencapai ini. Saya mencoba echodan teetetapi tidak berhasil.

Saya mencoba memasukkan baris repo di bagian atas sources.listfile dari terminal.

Catatan

Saya memerlukan solusi cepat satu baris, karena metode jawaban lain sudah saya kenal

Anwar
sumber
1
tee menambahkan garis di bagian bawah file misalnya echo "deb http://extras.ubuntu.com/ubuntu precise main" | sudo tee -a /etc/apt/sources.list- Anda juga perlu sudo sebelum tee untuk mendapatkan hak istimewa admin. Tetapi mengapa Anda ingin menambahkan sesuatu di bagian paling atas dari sources.list?
Savvas Radevic
2
@medigeek: di suatu tempat dalam sejarah pertanyaan OP Anda akan menemukan sesuatu tentang menginstal / memperbarui dari repo CD ... Saya menduga itu mungkin alasannya ...
ish
Terima kasih @izx, asumsi Anda sudah benar. Saya terkesan dengan tenang. Bisakah Anda juga menjawab pertanyaan itu. Itu tentang menginstal dari repo lokal menggunakan pusat perangkat lunak dan juga mengatur repo lokal saya untuk prioritas tertinggi tanpa menempatkannya di atas. Terima kasih lagi.
Anwar
1
@izx, Ini adalah tautan tentang mengatur prioritas tertinggi ke repositori lokal saya. Saya akan senang jika Anda juga dapat memeriksa pertanyaan ini tentang pusat perangkat lunak . Sekali lagi terima kasih atas komentar pertama Anda. sangat senang.
Anwar
1
@medigeek, Anda dapat melihat pertanyaan ini untuk penjelasan pertanyaan yang tidak biasa.
Anwar

Jawaban:

38

Ini sebenarnya cukup mudah dengan sed:

  • sed -i -e '1iHere is my new top line\' filename

  • 1imemberitahu sed untuk menyisipkan teks yang mengikuti pada baris 1 file; jangan lupa \baris baru di akhir sehingga baris 1 yang ada dipindahkan ke baris 2.

ish
sumber
1
Terima kasih. Hanya untuk catatan: jika Anda ingin mengganti, alih-alih memasukkan penggunaan salih-alih saya masuk 1i.
Anwar
3
Sayangnya ini gagal untuk file kosong (tidak memiliki garis tinju, jadi sed tidak pernah menyisipkan).
Tino
@Tino Untuk file kosong, Anda bisa menggunakanecho "Text Here" >> Filename
Flotolk
tidak bekerja di MacOS 10
Krishna
7

Dalam editing umum di tempat dengan script rumit, tetapi Anda dapat menggunakan echodan catkemudianmv

echo "fred" > fred.txt
cat fred.txt t.txt >new.t.txt
# now the file new.t.txt has a new line "fred" at the top of it
cat new.t.txt
# can now do the rename/move
mv new.t.txt t.txt

Namun jika Anda bermain dengan sources.list, Anda perlu menambahkan beberapa validasi dan anti peluru untuk mendeteksi kesalahan dll karena Anda benar-benar tidak ingin kehilangan ini. Tapi itu pertanyaan terpisah :-)

Sean
sumber
Saya sudah bisa melakukannya. Saya butuh solusi satu baris seperti yang diberikan izx. Namun terima kasih atas jawaban Anda.
Anwar
1
@AnwarShah - ah maaf! Anda seharusnya mengatakan itu dalam pertanyaan Anda :-)
Sean
Saya akui, +1 untuk jawaban Anda dan juga untuk komentar. (Saya tidak bisa memberi lebih banyak)
Anwar
6
./prepend.sh "myString" ./myfile.txt

diketahui bahwa itu prependadalah shell khusus saya :

#!/bin/sh
#add Line at the top of File
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

Gunakan juga jalur relatif atau jalur absolut, seharusnya berfungsi dengan baik:

./prepend.sh "my New Line at Top"  ../Documents/myfile.txt

Perbarui:

jika Anda ingin skrip permanen untuk ini, buka nano /etc/bash.bashrclalu tambahkan fungsi ini di akhir file:

function prepend(){
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

}

Buka kembali terminal Anda dan nikmati:

prepend "another line at top" /path/to/my/file.txt
Abdennour TOUMI
sumber
5

Dan mengapa tidak menggunakan editor teks asli untuk itu? ed adalah editor teks standar.

ed -s filename <<< $'1i\nFIRST LINE HERE\n.\nwq'

Atau, jika Anda ingin perintah lebih mudah dibaca:

ed -s filename < <(printf '%s\n' 1i "FIRST LINE" . wq)
  • 1: buka baris pertama
  • i: memasukkan mode
  • barang-barang Anda yang ingin Anda masukkan ...
  • .: berhenti memasukkan, kembali ke mode normal
  • wq: tulis dan berhenti, terima kasih, selamat tinggal.
gniourf_gniourf
sumber
Bagaimana cara menggunakan substitusi variabel shell (dalam FIRST LINE) dengan ini?
vp_arth
1
@vp_arth Jika konten Anda di variabel first_linemaka: ed -s filename < <(printf '%s\n' 1i "$first_line" . wq). Pastikan variabel tidak meluas ke satu titik, dan tidak mengandung karakter baris baru (jadi bersihkan jika berasal dari input pengguna).
gniourf_gniourf
3

Selalu ada awkopsi. Ganti stringvariabel dengan konten Anda. Namun ini bukan perubahan di tempat. Secara pribadi, saya cenderung tidak melakukan perubahan di tempat. Ini jelas merupakan preferensi pribadi. Dua hal, -vmenandakan suatu variabel dalam awk dan variabel ndigunakan di sini untuk mencocokkan nomor baris, secara efektif NR == 1. Anda dapat menggunakan ini dalam sejumlah cara apa pun hanya dengan mengubah nilai ndan s.

string="My New first line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}'     file.source > file.target

Contoh:

% cat file.source                                                                                                                                      

First Line
Second Line
Third Line

% string="Updated First Line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}' file.source > file.target; cat ./file.target                      !698

Updated First Line
First Line
Second Line
Third Line
slashdot
sumber
2

Anda dapat menggunakan Vim dalam mode Ex:

ex -sc '1i|hello world' -cx sources.list
  1. 1 pilih baris 1

  2. i masukkan baris teks baru

  3. x Simpan dan tutup

Steven Penny
sumber
Jauh lebih sederhana daripada solusi lain yang disediakan sejauh ini. Terima kasih.
Pothi Kalimuthu