Jawaban:
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.
sed -i
bukan POSIX. Itu GNU. FreeBSD sed
memiliki opsi serupa, tetapi Anda perlu di sed -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
:|paste -d'foo ' - - - - input > output
(hanya bercanda, meskipun Anda mungkin akan menemukan itu yang tercepat dari semua solusi yang diposting di sini: -b).
Cara kanonik adalah:
sed 's/^/foo /' < input > output
Namun, itu tidak mudah diadaptasi ke string sewenang-wenang. Contohnya,
sed "s/^/$var /"
Hanya bekerja jika $var
tidak mengandung, &
, \
, /
atau karakter baris baru.
Dalam hal itu,
export var
awk '{print ENVIRON["var"], $0}'
atau
perl -pe '$_="$ENV{var} $_"'
akan bekerja lebih baik.
Saya menyajikan solusi menggunakan awk
prepending the string "foo".
awk '{ print "foo", $0; }' input > output
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. Lihat sed
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.
{ rm file; awk '{ print "foo", $0 }' > file; } < file
reducto# wc -l foo
`914 foo` Sepertinya reducto# { 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!
ex sample.txt -c "%s/^/foo /" -c wq
Ada keuntungan tambahan bahwa perintahnya mudah dan jelas bagi siapa saja yang berpengalaman dalam satu editor yang benar.
Anda dapat menggunakannya perl
untuk melakukan ini:
$ perl -pi -e 's/^/mystring /' afile.txt
Buat file sampel.
$ seq 5 > afile.txt
$ cat afile.txt
1
2
3
4
5
Jalankan perintah di atas:
$ perl -pi -e 's/^/mystring /' afile.txt
$ cat afile.txt
mystring 1
mystring 2
mystring 3
mystring 4
mystring 5
sed
, saya menunjukkan cara menggunakan Perl .... tidak mencari perang suci dalam masalah ini.
Cukup menggunakan Bash
while IFS= read -r line; do echo "foo" "${line}" ; done < input > Output
Menggunakan Python
python -c "import sys; print 'foo '.join([ l for l in sys.stdin.readlines() ])" < input > Output
Jika Anda ingin mengedit di tempat
import fileinput
import sys
for line in fileinput.input(['inputfile'], inplace=True):
sys.stdout.write('foo {l}'.format(l=line))
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:
vi filename.txt
Esc(untuk memastikan Anda dalam NORMAL
mode), lalu masukkan perintah berikut:
:1,$ s/^/mystring
1,$
dengan sederhana %
. Ini yang membuat perintah :%s/^/string/
.
-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.