Anda bisa menggunakan sed
:
sed -i 's/^/your_string /' your_file
Berkat komentar Stephane dan Marco, perhatikan bahwa -i
opsi ini bukan POSIX. Cara POSIX untuk melakukan hal di atas adalah
sed 's/^/your_string /' your_file > tmp_copy && mv tmp_copy your_file
atau perl
:
perl -pi -e 's/^/your_string /' your_file
Penjelasan
Kedua perintah melakukan substitusi regex, mengganti awal baris ( ^
) dengan string yang Anda inginkan. The -i
beralih di kedua perintah memastikan file tersebut diedit di tempat (yaitu perubahan tercermin dalam file bukannya dicetak ke stdout).
sed
harus tersedia pada OS perl
yang mendukung POSIX dan harus tersedia di sebagian besar Unices modern kecuali mungkin untuk yang telah melalui upaya menghapusnya.
-i
Switch tidak mengedit file pada tempatnya. Itu menciptakan file baru dan menimpa yang asli setelah selesai (bukti: perubahan inode). Tidak banyak alat yang benar-benar melakukan pengeditan di tempat, yang merupakan operasi berbahaya. Selain itu, karena Anda menyebutkan POSIX,-i
switch tidak wajib untuk POSIX yang kompatibelsed
, itu adalah fitur dari beberapa implementasi tertentu.sed -i
bukan POSIX. Itu GNU. FreeBSDsed
memiliki opsi serupa, tetapi Anda perlu dised -i ''
sana.-i
membuat salinan sementara (itu sebabnya saya mengatakan perubahan tercermin dalam file asli); Maksud saya, Anda mendapatkan semantik yang sama dengan substitusi di tempat. Periksa apakah jawaban yang diperbarui sesuai dengan POSIX.$$
(id proses shell saat ini) sebagai bagian dari nama file sementara; itu menghindari upaya memikirkan nama unik yang dijamin setiap saat:command filename > filename.$$ && mv filename.$$ filename
(hanya bercanda, meskipun Anda mungkin akan menemukan itu yang tercepat dari semua solusi yang diposting di sini: -b).
Cara kanonik adalah:
Namun, itu tidak mudah diadaptasi ke string sewenang-wenang. Contohnya,
Hanya bekerja jika
$var
tidak mengandung,&
,\
,/
atau karakter baris baru.Dalam hal itu,
atau
akan bekerja lebih baik.
sumber
Saya menyajikan solusi menggunakan
awk
prepending the string "foo".awk
adalah lintas-platform dan tersedia di sistem POSIX apa pun. Itu tidak melakukan pengeditan di tempat. Jika Anda ingin mengedit file tanpa membuat yang kedua, Anda harus menggunakan file sementara. Lihatsed
jawaban Joseph , itu menunjukkan sintaks. Peretasan lain adalah dengan menggunakan sintaks berikut, yang pada dasarnya membuat file sementara dengan nama file yang sama dengan file asli.sumber
reducto# wc -l foo
`914 foo` Sepertinyareducto# { rm foo ; awk '{ print "prepend" , $0 }' > foo } < foo
>
ini tidak berhasil. Saya mencoba karena pengalihan ke asli membuat saya gugup, tetapi itu tidak akan dimulai.Anda dapat menghindari masalah pengeditan di tempat dengan alat streaming dengan menggunakan alat yang biasanya melakukan pengeditan di tempat - editor!
Ada keuntungan tambahan bahwa perintahnya mudah dan jelas bagi siapa saja yang berpengalaman dalam satu editor yang benar.
sumber
Anda dapat menggunakannya
perl
untuk melakukan ini:Contoh
Buat file sampel.
Jalankan perintah di atas:
sumber
sed
, saya menunjukkan cara menggunakan Perl .... tidak mencari perang suci dalam masalah ini.Cukup menggunakan Bash
Menggunakan Python
Jika Anda ingin mengedit di tempat
Tautan referensi
sumber
awk
pada file yang sangat kecil. Perilaku bervariasi di seluruh implementasi gema dan strips memimpin dan tertinggal kosong dan proses backslash khusus.prefix () { while IFS= read -r REPLY; do printf "%s%s\n" "$1" "$REPLY"; done; }
seharusnya lebih benar.{}
? Saya pikir @Matt menyarankan Anda membuatnya menjadi fungsi bernama, apa gunanya{}
tanpa nama fungsi?Atau Anda dapat melakukan hal berikut:
Esc(untuk memastikan Anda dalam
NORMAL
mode), lalu masukkan perintah berikut:sumber
1,$
dengan sederhana%
. Ini yang membuat perintah:%s/^/string/
.