web-dev-qa-db-ja.com

--side-by-side diffの右側のみを表示

私はこれを回避する方法を見つけていないようです。 diff --side-by-side出力の右側のみを取得するワンライナーはありますか?

例えば:

このため:diff --side-by-side file1 file2この2つのタイプの結果のいずれかを取得します。

  2 Africa                            |   3 Africa
  3 America                               3 America    
  3 Asia                                  3 Asia
  4 Antarctica                            4 Antarctica
  4 Oceania                               4 Oceania
  7 Europe                                7 Europe

または

  3 Africa                                3 Africa
  3 America                               3 America
  3 Asia                              <
  4 Antarctica                            4 Antarctica
                                      >   4 Asia
  4 Oceania                               4 Oceania
  8 Europe                                8 Europe

どうすればこれらをこれに変換できますか

| 3 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  7 Europe

そしてこれはそれぞれ:

  3 Africa
  3 America
  4 Antarctica
> 4 Asia
  4 Oceania
  8 Europe

この質問で正当化されるように、diffの元の出力を編集したことに注意してください。それらは端末で(列方向に)整列して表示されますが、端末に表示されるように正確に表示されるようにここで少し調整する必要がありました(列がきれいに整列されます)が、この入力ファイルを作成して出力を複製できます:

File1バージョン1

  2 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  7 Europe

File2バージョン1

  3 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  7 Europe

File1バージョン2

  3 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  8 Europe

File2バージョン2

  3 Africa
  3 America
  4 Antarctica
  4 Asia
  4 Oceania
  8 Europe
4

あなたが望むように見えるのは、まったく横並びの差分ではなく、古いファイルまたは新しいファイルから行を完全に除外するようにフォーマットをカスタマイズするものです。たとえば、与えられた

$ cat file1v1
  2 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  7 Europe
$ cat file2v1
  3 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  7 Europe

それから

$ diff --new-line-format='| %L' --unchanged-line-format='  %L' --old-line-format= file1v1 file2v1
|   3 Africa
    3 America
    3 Asia
    4 Antarctica
    4 Oceania
    7 Europe

与えられながら

$ cat file1v2
  3 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  8 Europe

$ cat file2v2
  3 Africa
  3 America
  4 Antarctica
  4 Asia
  4 Oceania
  8 Europe

それから

$ diff --new-line-format='> %L' --unchanged-line-format='  %L' --old-line-format= file1v2 file2v2
    3 Africa
    3 America
    4 Antarctica
>   4 Asia
    4 Oceania
    8 Europe
4
steeldriver

これは実際には右列ですが、最終的には左になります。また、それは非常にいソリューションであり、私はいくつかの賢い人々が良くなると確信しています。とにかくここにあります:

$ diff --side-by-side file1 file2 | sed -r 's/[^\t]*\t*(.*)/\1/' | sed -r 's/^ *(\||>|<)\t /\1/'

| 3 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  7 Europe

説明

  • -r EREを使用
  • s/old/new/oldを `newに置き換えます
  • [^\t]*タブ以外のもの、お願いします
  • \t*好きなだけのタブ
  • (.*)行の任意の数の任意の文字、(保存)後で使用するため
  • \1保存したパターン
  • s/^ *(\||>|<)\t /\1/整列を修正するために異なる行の|または>または<文字の周りのものを取り除きます
2
Zanna