テキストの最後の行だけ消したい時、どうやればいい?

  • 16
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

いきなり問題

次のように最後に必ず、余計な一行がくっついてくるテキストファイル(question.txt)がありました。

question.txt
こんにちは。
今日もいい天気ですね。
  :
 ♪なんだかんだ~
  :
  : (途中は何行あるかわかりません)
  :
 ♪どーしたこーした~
 ホゲーィ!
  :
さようなら。
.

この最後の一行だけを取り除いて出力したい時、どう書きますか?
(ヒント:このTipsのタグ)

Thinking time

 :
 :
 :
 :
 :
 :
 :
 :
 :
 :
 :
 :
 :
 :
 :
 :
 :
 :
 :
 :
 :
 :
 :
 :
 :
 :
 :
 :
 :
 :

こたえ

最もシンプルなこたえ
$ sed '$d' question.txt
別解
$ sed -n '$!p' question.txt

シェルスクリプトのwhile文、あるいはAWKコマンドなどで、「一行先読みして……。読み込みに成功したら先読みしていた行を出力して……」とかやらなくてもいいんですね。

sedのアドレス部に$を指定すると、最後の行を表すのでそれに対してd(削除)を実行してあげればいいというわけです。ちなみに$!と指定すると「最後の行以外」という意味になるので、そこをp(表示)するのでもイケます。(ただしこの場合は-nオプションが必要)

この$を応用すれば、最後の行だけいろいろと特別な加工をすることが簡単にできますね。先読みなんていう技を使わずに。