Saya memiliki skrip bash yang menyebutkan setiap file * .php di direktori dan berlaku iconv
untuk itu. Ini mendapatkan output dalam STDOUT.
Karena menambahkan -o
parameter (menurut pengalaman saya) sebenarnya menulis file kosong mungkin sebelum konversi terjadi, bagaimana saya bisa menyesuaikan skrip saya sehingga melakukan konversi, lalu menimpa file input?
for file in *.php
do
iconv -f cp1251 -t utf8 "$file"
done
shell
text-processing
io-redirection
omeraliev meder
sumber
sumber
Jawaban:
Ini tidak berfungsi karena
iconv
pertama-tama membuat file output (karena file sudah ada, memotongnya), kemudian mulai membaca file inputnya (yang sekarang kosong). Sebagian besar program berperilaku seperti ini.Buat file sementara yang baru untuk output, lalu pindahkan ke tempatnya.
Jika platform
iconv
Anda tidak memiliki-o
, Anda dapat menggunakan pengalihan shell untuk efek yang sama.sponge
Utilitas Colin Watson (termasuk dalam moreutils Joey Hess ) mengotomatisasi ini:Jawaban ini berlaku tidak hanya untuk
iconv
tetapi untuk program filter apa pun. Beberapa kasus khusus perlu disebutkan:-p
memiliki-i
opsi untuk mengganti file di tempat.grep
,tr
,sed 's/long input text/shorter text/'
), dan Anda seperti tinggal berbahaya, Anda mungkin ingin benar-benar memodifikasi file di tempat (solusi lain yang disebutkan di sini membuat file output baru dan pindahkan ke tempatnya di akhir, sehingga data asli tidak berubah jika perintah terputus karena alasan apa pun).sumber
sponge
harus dikaitkan secara eksklusif dengan Joey Hess; itu adalah paketmoreutils
yang termasuksponge
yang dia pertahankan, tetapi mengenai asal usulnyasponge
, dengan mengikuti tautan dari berandamoreutils
, saya telah menemukannya pada awalnya diposting dan disarankan untuk dimasukkan oleh Colin Watson: "Joey menulis tentang kurangnya alat baru yang cocok dengan filosofi Unix. Favorit saya dari hal-hal seperti yang saya tulis adalahsponge
"(Senin, 06 Februari 2006)iconv -f cp1251 -t utf8 "$file" > "$file.new"
sort
, cukup pintar tentang-o
parameter, dan jika mereka mendeteksi file output sama dengan input mereka secara internal mengelola file temp sehingga hanya berfungsi.Alternatifnya adalah
recode
, yang menggunakan perpustakaan libiconv untuk beberapa konversi. Perilakunya adalah mengganti file input dengan output, jadi ini akan berfungsi:Saat
recode
menerima beberapa file input sebagai parameter, Anda dapat menggunakanfor
loop:sumber
info recode
saja. Lebih banyak bertele-tele.Untuk sekarang
bekerja seperti pesona
sumber
Anda dapat menggunakan Vim dalam mode Ex:
%
pilih semua garis!
jalankan perintahx
Simpan dan tutupsumber
Ini adalah contoh sederhana . Seharusnya memberi Anda cukup info untuk memulai.
sumber
bekerja untukku
sumber
Anda dapat menggunakan find, setidaknya ini bekerja untuk saya di Raspbian Stretch:
sumber
Salah satu opsi adalah menggunakan
perl
antarmuka untukiconv
dan-i
modenya untuk mengedit inplace:Dengan GNU
awk
, Anda juga dapat melakukan sesuatu seperti:The
ksh93
shell juga memiliki>;
operator yang untuk itu yang menyimpan output dalam file temp yang berganti nama menjadi file diarahkan jika perintah berhasil:sumber