Frage

Ich arbeite auf einem Mac, mit einigen ziemlich alten Dateien. Verschiedene Dateien wurden von verschiedenen Programmen erstellt wird, so dass einige von ihnen mit \ r (mac) und teilweise mit \ n (Unix) beenden. Ich möchte in der Lage sein, Befehle wie diff zu laufen, grep, etc. auf diese Dateien, aber diejenigen, die r \ haben als eine Riesen-Linie behandelt. weiß jemand von einer Version von diff, grep, etc., die korrekt mit allen neuen Linien funktionieren werden?

ETA: Ich möchte sie auch Unix-Dienstprogramme sein, damit ich sie in Skripten verwenden kann, Emacs, etc ...

War es hilfreich?

Lösung

Wie Jay sagte, Diff'nPatch scheint, was Sie suchen. Alternativ können Sie alle Ihre ‚\ r‘ Zeilenenden in ‚\ n‘ in einem einzigen Befehl wie folgt konvertieren:

sed -ie 's/\r/\n/' filename

oder

find . | xargs -n1 sed -ie 's/\r/\n/'

(Sie können die Liste der Dateien in irgendeiner Weise im letzteren Fall filtern, oder es wird in allen Unterverzeichnissen auf alle Dateien angewendet werden.)

Andere Tipps

Wenn Sie diff -w verwenden es Leerzeichen in den Dateien ignoriert, die für Ihre Bedürfnisse wahrscheinlich ausreichend ist.

Bearbeiten : nur erkannte ich die Post zum ersten Mal falsch verstanden und Sie suchen tatsächlich für eine diff, die mit \r Zeilenenden arbeiten. Mein Vorschlag wäre, die Dateien mit so etwas wie Flip konvertieren , dass die Dateien in ein \n Standardformat konvertieren kann.

EDIT 2 : gefunden Nur etwas, das aussieht wie, was Sie wollen -

Das Diff mit OSX Lion gebündelt hat eine Option ‚streifennachlauf cr‘ so macht, dass Sie wollen. Sie verwenden es, etwa so:

diff -cpt a.c b.c --strip-trailing-cr

Der dos2unix Befehl könnte hilfreich sein, Ihre Dateien auf ein einheitliches Format zuerst bei der Umwandlung. Ich glaube, dass es jede Plattform verfügbar ist für fast Sie denken können und auf vielen Dateien auf einmal ausgeführt werden können. Ich glaube, es ist ein Paket für Mac.

PhpStorm der diff Ansicht des "ignorieren Leerzeichen" funktioniert . Es ignoriert automatisch Unterschiede in den Wagenrücklauf / EOL / Newline / was-haben-Sie. Sie können Ihre Zeit Hantieren mit obskurer Unix verschwenden Befehlen oder was auch immer, oder Sie könnten nur etwas, das tatsächlich funktioniert und uns darauf, mit Leben bewegen.

Ja, meine Zeilenumbrüche sind \ r, aber so was? Arrr! Wenn die Software zu dumm ist, dass \ r zu erkennen == \ n dann werde ich nur verschiedene Software verwenden, die ist smart genug.

PhpStorm war die einzige Software, die ein Diff-Tool hatte, die „nur gearbeitet“ - das ist, was erwarte ich, dass Mac-Software zu tun. Ich erwarte, dass Mac-Software einfach funktionieren . Ich benutze einen Mac, so kann ich meine Arbeit tun, anstatt an jeder Ecke arkanen Terminal-Befehle zu lernen, die fast alle schlecht dokumentiert sind, erwarten Sie nur verstehen, wie die Befehle sollen ohne klare Beispiele formatiert werden, so dass Sie nie wissen, ob Sie es falsch zu machen oder wenn der Befehl einfach nicht funktioniert nur wie alle anderen schlechte Software. Nehmen Sie dieses Beispiel aus "Mann diff":

   -I RE  --ignore-matching-lines=RE
          Ignore changes whose lines all match RE.

OK, so dass diese gelesen zu haben, habe ich keine Ahnung, was es bedeutet. Es gibt kein Beispiel für seine Nutzung. Was ist „RE“? Es ist nicht überall sagen.

Dann gibt es dieses Juwel:

  --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

   %=     lines common to FILE1 and FILE2

   %[-][WIDTH][.[PREC]]{doxX}LETTER
          printf-style spec for LETTER

          LETTERs are as follows for new group, lower case for old group:

   F      first line number

   L      last line number

   N      number of lines = L-F+1

   E      F-1

   M      L+1

          LFMT may contain:

   %L     contents of line

   %l     contents of line, excluding any trailing newline

   %[-][WIDTH][.[PREC]]{doxX}n
          printf-style spec for input line number

          Either GFMT or LFMT may contain:

   %%     %

   %c'C'  the single character C

   %c'\OOO'
          the character with octal code OOO

Ich kann keinen Sinn machen, was auch immer diese Passage. Was ist der „Eingang“? Ist es beide Dateien oder nur die „auf“ Datei oder nur die „von“ Datei? Was ist „ähnlich“ bezieht sich auf? Was bedeutet „ist“ im Satz bedeuten, „GFMT‚ist‘LTYPE oder` geändert '“? Bedeutet es, „ersetzt werden durch“? Wenn ja, dann ist, warum nicht „GFMT“ in Anführungszeichen oder Klammern usw.? Da kein Beispiel gegeben wird, gibt es keine Möglichkeit zu wissen; die Formulierung der Dokumentation ist völlig unklar. Was bedeutet „GFMT enthalten“ ... das? Bedeutet „enthalten“ bedeutet, dass der Text die Abkürzung GFMT ersetzen kann, dass enthalten? Ohne ein klares Beispiel ist es völlig nutzlos.

Warum du die Mühe sogar einen Mann Seite zu schreiben, wenn Sie es so kryptisch und zweideutig machen werden es ist nutzlos für jeden, der nicht bereits wissen, wie die Software zu nutzen, im Grunde? An diesem Punkt ist es kein Handbuch; es ist nur eine Schnellreferenzseite für die Jungs, die die Software geschrieben, so dass sie daran erinnern, wie es zu benutzen. Ich denke, sie nehme an, Sie müssen nur den Source-Code selbst lesen, wenn Sie wissen wollen, was es tatsächlich der Fall ist.

Meine Zeit ist wertvoll. Ich würde lieber zahlen nur das Geld ein Stück Software, die korrekt tatsächlich funktioniert und ordnungsgemäße Dokumentation hat.

Da diese alle fehlgeschlagen:

 diff -d --strip-trailing-cr --ignore-all-space --from-file=rest.phtml test.phtml

... fehlgeschlagen \ r Zeichen zu ignorieren.

 diff -wd --strip-trailing-cr --ignore-all-space --from-file=rest.phtml test.phtml

... fehlgeschlagen \ r Zeichen zu ignorieren.

 diff -wd --suppress-common-lines --strip-trailing-cr --ignore-all-space --from-file=rest.phtml test.phtml

... fehlgeschlagen \ r Zeichen zu ignorieren.

 diff -wd test.phtml rest.phtml --suppress-common-lines --strip-trailing-cr --ignore-all-space

... fehlgeschlagen \ r Zeichen zu ignorieren.

 diff -awd test.phtml rest.phtml --suppress-common-lines --strip-trailing-cr --ignore-all-space

... fehlgeschlagen \ r Zeichen zu ignorieren.

Für diese Angelegenheit, wenn sie n Zeichen wurden \ es auch nicht, wenn die \ n Zeichen hinzugefügt werden.

Wo test.phtml ==

  

foo

     

bar

und rest.html ==

  

foobar

Der "diff" Befehl immer gibt Ihnen so etwas wie:

  
     

* 1,2 ** ! foo! bar \ No newline am Ende der Datei

     

--- 1 ----! foobar \ No Newline am Ende der Datei

... nicht!

habe ich die folgende schnelle Lösung, die Nachteile (siehe unten) hat:

1 : Führen Sie eine diff und Liste nur die Dateinamen

diff -r -q dir1/ dir2/

2 . Öffnen und jede aufgelistete Datei mit dem Editor speichern, die verwendet wurde, wird dies die Zeilenende ändern

3 : Führen Sie eine regelmäßige diff

Die Nachteile sind:

  • weniger robust, fehleranfällig
  • mehr Arbeit, wenn Sie viele Dateien
  • haben

Das funktioniert für mich:

diff -r --ignore-all-space dir1/ dir2/

Ich bin auf OSX und haben Dateien von OSX und Windows gemischt. Credit: http: //www.codealpha.net/514/diff-and-ignoring-spaces-and-end-of-lines-unix-dos-eol/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top