perl -pe 'chomp if eof' filename >filename2
atau, untuk mengedit file di tempat:
perl -pi -e 'chomp if eof' filename
Ini digambarkan sebagai 'penghujatan perl' di situs web awk yang saya lihat.
Tapi, dalam sebuah tes, itu berhasil.
Anda dapat memanfaatkan fakta bahwa penggantian perintah shell menghapus karakter baris baru yang tertinggal :
Bentuk sederhana yang berfungsi di bash, ksh, zsh:
printf %s "$(< in.txt)" > out.txt
Alternatif portabel (sesuai POSIX) (sedikit kurang efisien):
printf %s "$(cat in.txt)" > out.txt
Catatan:
- Jika
in.txt
diakhiri dengan banyak karakter baris baru, substitusi perintah menghapus semua dari mereka . (Ini tidak menghapus karakter spasi selain mengikuti baris baru.) - Karena pendekatan ini membaca seluruh file masukan ke dalam memori , disarankan hanya untuk file yang lebih kecil.
printf %s
memastikan bahwa tidak ada baris baru yang ditambahkan ke output (itu adalah alternatif yang sesuai dengan POSIX untukecho -n
yang tidak standar; lihat http://pubs.opengroup.org/onlinepubs/009696799/utilities/echo.html dan https://unix.stackexchange.com/a/65819)
Sebuah panduan untuk jawaban lainnya :
-
Jika Perl tersedia, pilih jawaban yang diterima - sederhana dan hemat memori (tidak membaca seluruh file masukan sekaligus).
-
Jika tidak, pertimbangkan Awk dari ghostdog74 jawaban - tidak jelas, tetapi juga hemat memori; padanan yang lebih mudah dibaca (sesuai POSIX) adalah:
-
awk 'NR > 1 { print prev } { prev=$0 } END { ORS=""; print }' in.txt
-
Pencetakan ditunda satu baris sehingga baris terakhir dapat ditangani di
END
blok, di mana ia dicetak tanpa\n
di belakangnya karena menyetel pemisah catatan keluaran (OFS
) ke string kosong. -
Jika Anda menginginkan solusi verbose, namun cepat dan kuat yang benar-benar dapat diedit di tempat (berlawanan dengan membuat file temp. yang kemudian menggantikan yang asli), pertimbangkan skrip Perl jrockway .