diffで差分の行を'> 'をつけずにそのまま表示するにはold-line-format、new-line-format、unchanged-line-formatを使う
ログファイルに欠損があって「新しいファイルにだけある行を表示したいなぁ」というよくある要望がでまして。
今までは
diff old new | perl -nle 's/> // and print $_'
みたいなことして表示してたんだけど「きっともっと楽な方法あるよね」と思いman diffしてみることに。
(comm使えばできるけどsortしなくちゃなのでやめました)
んで、new-line-formatというのを見つけたのだけど、これをやっても「新しい行全て」が表示されてしまい「あれれー!」となる。
--new-line-format=FORMAT if-then-else 形式で、 2 番目のファイルだけにある行の出力に FORMAT を用いる。
最後の方まで読むと例が書いてあって"unchanged-line-formatも一緒に使えば良い"ということがわかりました。
--unchanged-line-format=FORMAT if-then-else 形式で、両方のファイルに共通な行の出力に FORMAT を用いる。
つまり、以下のように「new-lineを%Lで改行あり表示しつつ、変更してないやつは''で非表示にして握りつぶす」とやれば良い。
diff --new-line-format='%L' --unchanged-line-format='' old new
もし、oldの方の差分もあって一緒に出したいなら、
diff --old-line-format='%L' --new-line-format='%L' --unchanged-line-format='' a.txt b.txt
とやれば良いですね。
% cat a.txt 1 2 3 4 5 % cat b.txt 2 4 6 % diff a.txt b.txt 1d0 < 1 3d1 < 3 5c3 < 5 --- > 6 % diff --old-line-format='%L' --new-line-format='%L' --unchanged-line-format='' a.txt b.txt 1 3 5 6