Chciałbym, aby (GNU) DIFF wypisał tylko linie różniące się w jednym pliku. Tak podane
==> diffa.txt <==
line1
line2 - in a only
line3
line4 changed
line5
==> diffb.txt <==
line1
line3
line4 changed in b
line5
line6 in b only
chciałbym diff --someoption diffa.txt diffb.txt
produkować
line2 - in a only
line4 changed
Poniższe wygląda na to, że powinno być pomocne, ale jest nieco tajemnicze:
--GTYPE-group-format=GFMT
Similar, but format GTYPE input groups with GFMT.
--line-format=LFMT
Similar, but format all input lines with LFMT.
--LTYPE-line-format=LFMT
Similar, but format LTYPE input lines with LFMT.
LTYPE is `old', `new', or `unchanged'.
GTYPE is LTYPE or `changed'.
GFMT may contain:
%< lines from FILE1
%> lines from FILE2
Odpowiedzi:
Nie jestem pewien, czy
diff
sam to potrafi, ale zawsze możesz skorzystać z mocy innych narzędzi GNU, aby ci pomóc.Robi różnicę, a następnie wybiera tylko linie zaczynające się od „-” - te są zmieniane i mają wartości z pliku diffa.txt, a następnie
sed
po prostu usuwają te znaki „-”.Edycja: po kilku eksperymentach z
diff
, wygląda na to, że poniższe polecenie generuje to, co chcesz:źródło
--changed-group-format='%<'
robisz dla mnie teraz ....Prostszą metodą jest użycie
comm
narzędzia linux (potrzebuje pliku posortowanego do wprowadzania). Zapisuje na standardowe wyjście:linie, które są unikalne dla diffa.txt
linie, które są unikalne dla diffb.txt
linie, które są wspólne
i możesz wyłączyć każdy z nich odpowiednio parametrem 1,2 lub 3. W twoim przypadku będzie to wyglądać tak:
comm -23 diffa.txt diffb.txt
Pomija linie unikalne dla diffb.txt, linie wspólne i drukuje linie unikalne tylko dla diffa.txt
Źródło: https://www.tutorialspoint.com/unix_commands/comm.htm
źródło
diff
to, co nie robi tego, czego oczekuję. I wierzę, że jest preinstalowany zarówno na BSD (tj. Mac OS X), jak i na Ubuntu, więc nie ma koszmarów menedżera pakietów.Chciałbym wspomnieć, że
comm
oczekuje posortowanych plików wejściowych, a tym samym zgłasza inne wyniki niżdiff
.jest uniwersalny. Uznanie dla @vava
źródło