perl -pe 'chomp if eof' filename >filename2
または、その場でファイルを編集するには:
perl -pi -e 'chomp if eof' filename
これは、私が見た awk Web サイトで「perl blasphemy」と説明されていました。
しかし、テストではうまくいきました。
シェル コマンドの置換により末尾の改行文字が削除されるという事実を利用できます :
bash、ksh、zsh で動作する単純な形式:
printf %s "$(< in.txt)" > out.txt
ポータブル (POSIX 準拠) の代替 (わずかに効率が悪い):
printf %s "$(cat in.txt)" > out.txt
注:
- If
in.txt
複数で終わる 改行文字、コマンド置換は all を削除します それらの . (末尾の改行以外の空白文字は削除されません。) - このアプローチは入力ファイル全体をメモリに読み込むため 、小さいファイルにのみ推奨されます。
printf %s
出力に改行が追加されないようにします (非標準のecho -n
に代わる POSIX 準拠の代替手段です)。; http://pubs.opengroup.org/onlinepubs/009696799/utilities/echo.html および https://unix.stackexchange.com/a/65819 を参照してください)
他の回答へのガイド :
-
Perl の場合 利用可能です。受け入れられた回答を求めてください - シンプルでメモリ効率が良い (入力ファイル全体を一度に読み取るわけではありません)。
-
それ以外の場合は、ghostdog74 の Awk を検討してください 答え - あいまいですが、メモリ効率も良い; より読みやすいもの (POSIX 準拠) は:
-
awk 'NR > 1 { print prev } { prev=$0 } END { ORS=""; print }' in.txt
-
END
で最終行を処理できるように、印刷が 1 行遅れます。 ブロック、末尾の\n
なしで出力されます 出力レコード区切り文字 (OFS
の設定による) ) を空の文字列にします。 -
詳細でありながら高速で堅牢なソリューションが必要な場合、実際にその場で編集 (元のファイルを置き換える一時ファイルを作成するのではなく)、jrockway の Perl スクリプト を検討してください。 .