diff - wie man leere Zeilen ignoriert

8

Ich muss zwei Dateien unterscheiden, wobei alle Leerzeichen und Leer- / Leerzeichenzeilen ignoriert werden, aber aus bestimmten Gründen funktionieren die Diff-Optionen, die ich gefunden habe, nicht alle, sie zeigen weiterhin die Leerzeile in Datei1 ...

$ cat file1
2 nodes configured
13 resources configured

$ cat file2
2 nodes configured
23 resources configured
$ diff -ywBEZb -W 200 --suppress-blank-empty --suppress-common-lines file1 file2
13 resources configured                                                                            |    23 resources configured
                                                                                                   <
$ od -bc file1
0000000 062 040 156 157 144 145 163 040 143 157 156 146 151 147 165 162
          2       n   o   d   e   s       c   o   n   f   i   g   u   r
0000020 145 144 012 061 063 040 162 145 163 157 165 162 143 145 163 040
          e   d  \n   1   3       r   e   s   o   u   r   c   e   s
0000040 143 157 156 146 151 147 165 162 145 144 012 012
          c   o   n   f   i   g   u   r   e   d  \n  \n
0000054
$ od -bc file2
0000000 062 040 156 157 144 145 163 040 143 157 156 146 151 147 165 162
          2       n   o   d   e   s       c   o   n   f   i   g   u   r
0000020 145 144 012 062 063 040 162 145 163 157 165 162 143 145 163 040
          e   d  \n   2   3       r   e   s   o   u   r   c   e   s
0000040 143 157 156 146 151 147 165 162 145 144 012
          c   o   n   f   i   g   u   r   e   d  \n
0000053
$ diff -ywBEZb -W 200 --suppress-blank-empty --suppress-common-lines file1 file2 | od -bc -
0000000 061 063 040 162 145 163 157 165 162 143 145 163 040 143 157 156
          1   3       r   e   s   o   u   r   c   e   s       c   o   n
0000020 146 151 147 165 162 145 144 011 011 011 011 011 011 011 011 011
          f   i   g   u   r   e   d  \t  \t  \t  \t  \t  \t  \t  \t  \t
0000040 011 040 040 040 174 011 062 063 040 162 145 163 157 165 162 143
         \t               |  \t   2   3       r   e   s   o   u   r   c
0000060 145 163 040 143 157 156 146 151 147 165 162 145 144 012 011 011
          e   s       c   o   n   f   i   g   u   r   e   d  \n  \t  \t
0000100 011 011 011 011 011 011 011 011 011 011 040 040 040 074 012
         \t  \t  \t  \t  \t  \t  \t  \t  \t  \t               <  \n
0000117
$
Chris
quelle
Ich denke, das Problem hier ist, dass -Bleere Zeilen nicht einfach ignoriert werden, sondern Änderungen ignoriert werden , deren Zeilen alle leer sind . In Ihrem Fall wird die nachfolgende Leerzeile als Teil einer zusammenhängenden mehrzeiligen Änderung betrachtet, die am13 resources configured
steeldriver

Antworten:

13

Verwenden Sie den -BSchalter:

-B  --ignore-blank-lines  Ignore changes whose lines are all blank.

Verwenden Sie die Schalter -bund, um Leerzeichen zu ignorieren -w:

-b  --ignore-space-change  Ignore changes in the amount of white space.
-w  --ignore-all-space  Ignore all white space.

Oder einfach RTM .

BEARBEITEN:

Da -B(und einige andere diffSchalter) anscheinend nicht funktionieren (ich habe keine Informationen gefunden, ob sie als Fehler gemeldet wurden), müssen Sie Leerzeilen und Leerzeichen auf andere Weise ignorieren.

Ich würde so etwas vorschlagen:

[my@pc ~]$ cat file1.txt
2 nodes configured

13 resources configured

[my@pc ~]$ cat file2.txt
2 nodes configured
23 resources configured
[my@pc ~]$ diff <(grep -vE '^\s*$' file1.txt)  <(grep -vE '^\s*$' file2.txt)
2c2
< 13 resources configured
---
> 23 resources configured
13dimitar
quelle
2
Ich bin nicht sicher, ob Sie es in meinem Beitrag bemerkt haben, aber ich habe diese Optionen in meinem diff-Befehl verwendet: $ diff -ywBEZb ....
Chris
@ Chris Ich habe meine Antwort überarbeitet.
13dimitar
1

Ich kann mit dem Befehl helfen, die leeren Zeilen und Leerzeichen mit dem Befehl sed zu löschen

Verwenden Sie den folgenden Befehl, um leere oder leere Zeilen zu löschen

sed '/^$/d' filename

Leerzeichen in Linien entfernen

sed -r "s/\s+//g" filename

Nachdem Sie den obigen Befehl ausgeführt haben, können Sie den diffBefehl verwenden, um den Unterschied zwischen zwei Dateien zu ermitteln

Praveen Kumar BS
quelle