Show only right side of --side-by-side diff

6,624

Solution 1

What you seem to want is not a side-by-side diff at all - but rather one in which you customize the format to exclude lines from either the old or the new file completely. For example, given

$ 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

Then

$ 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

while given

$ 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

then

$ 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

Solution 2

This is actually the RIGHT column, though it ends up on the left. Also, it's a very ugly solution and I'm sure some smarter folks will do better. But here is is anyway:

$ 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

Explanation

  • -r use ERE
  • s/old/new/ replace old with `new
  • [^\t]* anything but tabs, please
  • \t* as many tabs as you like
  • (.*) any number of any characters on the line, (saved) for later
  • \1 the pattern we saved
  • s/^ *(\||>|<)\t /\1/ get rid of the stuff around the | or > or < character on lines that differ to fix the alignment
Share:
6,624

Related videos on Youtube

Tulains Córdova
Author by

Tulains Córdova

Updated on September 18, 2022

Comments

  • Tulains Córdova
    Tulains Córdova over 1 year

    I don't seem to find a way around this. Is there a one-liner to get only the right side of a diff --side-by-side output?

    For example:

    For this: diff --side-by-side file1 file2 I get either of this two types of results:

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

    or

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

    How can I turn those into this:

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

    And this respectively:

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

    Note that I edited the original output of diff so that it appears justified in this question. They appear aligned (column-wise) in the terminal but I had to adjust them a little bit here so they appear exactly as they appear in the terminal (columns neatly aligned), but you can replicate the output creating this input files:

    File1 version 1

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

    File2 version 1

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

    File1 version 2

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

    File2 version 2

      3 Africa
      3 America
      4 Antarctica
      4 Asia
      4 Oceania
      8 Europe
    
  • Tulains Córdova
    Tulains Córdova about 7 years
    +1 For the great answer. Problem is I don't know before hand whether the comparison will yield |s , >, or boths. Sample text files are merely illustrative.
  • Tulains Córdova
    Tulains Córdova about 7 years
    +1 For the great answer. Problem is I don't know before hand whether the comparison will yield |s , >, or boths. Sample text files are merely illustrative.
  • Zanna
    Zanna about 7 years
    @TulainsCórdova thanks :) I changed it to catch all of the characters, but I am not sure it does quite what you want