sedで最後の行だけ削除する

データの出力が途中で壊れて, 最後の行だけ異常になってしまった. それ以前のデータについては問題ないので最後の行だけ削除して保存しなおしたい. 最後の行だけ確認したいなら"tail -n 1 -q *.txt"などでいけるが, 削除するにはどうしたものか.

未だ使いこなせないsedを使うとできる.

sed -e '$d' foo.txt

これでfoo.txtの最後の行だけ削除したものを標準出力に出力する. dの前に数字を入れるとその行だけ削除してくれる. $は最終行を表す. '10,$d'とすると10行目から最終行まで削除する. あとはこれを一度どこかに書き出して上書きすれば良い.

#!/usr/bin/env bash
for f in $@
do
    echo "$f"
    sed -e '$d' $f > tmp.dat
    rm $f
    mv tmp.dat $f
done

"sed -e '$d' foo.txt > foo.txt"などとするとデータが全部吹っ飛ぶので注意. 上のスクリプトだと当然だがtmp.datがあるとうまく行かないので適切な一時ファイル名を与えてやるべき. あと, ファイルのアクセス権に関しては引き継がれない.

追記: 単に"-i"オプションで適切に上書きしてくれるらしい:

sed -i -e '$d' foo.txt

もうこれでいいな.