Saya punya masalah ekstrem, dan semua solusi yang bisa saya bayangkan rumit. Menurut pengalaman UNIX / Linux saya pasti ada cara mudah.
Saya ingin menghapus 31 byte pertama dari setiap file di /foo/
. Setiap file cukup panjang. Yah, saya yakin seseorang akan memberikan saya solusi yang sangat mudah saya tidak bisa bayangkan. Mungkin awk?
text-processing
files
sed
awk
von der tann
sumber
sumber
Jawaban:
atau lebih cepat, terima kasih atas saran Gilles:
Catatan: Ekor ekor menentukan "-c +32" bukan "+ 32c" tetapi ekor default Solaris tidak menyukainya:
/usr/xpg4/bin/tail
tidak masalah dengan kedua sintaksis.sumber
dd
sini berlebihan,tail
lebih tepat (lebih sederhana, lebih sedikit risiko kesalahan ketik pembunuh, tidak ada pesan palsu di stderr).cut
(bukankah seharusnya itu ekor? ... asis, itu tidak berhasil untuk saya .../usr/xpg4/bin
depan/usr/bin
pada AndaPATH
, atau Anda akan terjebak di awal 1990-an. Banyak penyatuan (mis. GNU, BusyBox) tidak lagi mendukung+32c
sintaksis historis , dan menganggapnya sebagai file yang dipanggil+32c
(seperti yang diperlukan POSIX).Perintah berikut memotong 31 byte pertama dari
$file
(menggunakan$file~
sebagai temp. Copy):Anda hanya perlu mendaftar atau
find
semua file di bawah/foo/
dan menjalankan keduanya di atas untuk setiap yang$file
ditemukan.sumber
tail -c +32
output inputnya minus 31 byte pertama. (Ya, argumennya mati satu per satu.) Untuk mengedit file di tempatnya, gunakan spons dalam satu lingkaran, atau jika Anda tidak memilikinya dan tidak ingin repot, lakukan tugasnya di shell:Jika perintah terputus karena alasan apa pun (mis. Kegagalan daya), mungkin sulit untuk mengetahui di mana Anda tinggalkan. Menulis file baru ke direktori terpisah akan membuat segalanya lebih mudah.
Jika file benar-benar besar (seperti pada, cukup besar yang memiliki dua salinan bahkan satu adalah masalah), Anda dapat menggunakan salah satu teknik yang disebutkan di utas ini .
sumber
Anda dapat menggunakan Vim dalam mode Ex:
%
pilih semua garis!
jalankan perintahx
Simpan dan tutupsumber