Domanda

Sto lavorando su un Mac, con alcuni piuttosto vecchi file. diversi file sono stati creati da programmi diversi, così alcuni di loro finiscono con \ r (Mac) e alcune con \ n (unix). Voglio essere in grado di eseguire comandi come diff, grep, ecc su questi file, ma quelli che hanno \ r vengono trattati come una linea gigante. qualcuno sa di una versione di diff, grep, ecc che funziona correttamente con tutte le nuove linee?

ETA: Mi piacerebbe anche loro di essere utility Unix modo che io possa utilizzare in script, Emacs, ecc ...

È stato utile?

Soluzione

Come ha detto Jay, Diff'nPatch sembra quello che stai cercando. In alternativa, è possibile convertire tutti i finali tua '\ r' di linea in '\ n' in un unico comando in questo modo:

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

o

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

(Si consiglia di filtrare l'elenco dei file in qualche modo in quest'ultimo caso o sarà applicato a tutti i file in tutte le sottodirectory.)

Altri suggerimenti

Se si utilizza diff -w ignorerà gli spazi bianchi nei file, che è probabilmente sufficiente per le vostre esigenze.

Modifica : appena realizzato ho letto male il palo per la prima volta e si sta in realtà alla ricerca di un diff che funzionerà con terminazioni di linea \r. Il mio suggerimento sarebbe quello di convertire i file con qualcosa come medaglia che può convertire i file in un formato standard \n.

Modifica 2 : Appena trovato qualcosa che assomiglia a ciò che si vuole - Diff'nPatch :

  

Diff'nPatch è un porto per il Macintosh   della GNU 'diff', 'patch' e 'cmp'   utilities. Esso consente di confrontare e   trovare le differenze tra due file o   cartelle, confrontare due file, generare   diff in vari formati (normale,   contesto, unidiff, ecc), si applicano   patch, confrontare i file byte per byte.   Può gestire qualsiasi tipo di terminatori di linea   (Mac, UNIX o Windows)

L'utilità diff in bundle con OSX Lion ha un'opzione 'strip-trailing-cr' che fa che si desidera. Si utilizza in questo modo:

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

Il comando dos2unix potrebbe essere utile per convertire i file in un formato coerente prima. Credo che sia disponibile per quasi ogni piattaforma che si può pensare e può essere eseguito su un sacco di file contemporaneamente. Credo che ci sia un pacchetto disponibile per Mac.

di "ignorare gli spazi bianchi" Vista diff di PhpStorm solo funziona . Essa ignora automaticamente le differenze di ritorno a capo / EOL / ritorno a capo / cosa-hanno-te. Si può perdere il tuo tempo a giocherellare con arcana comandi UNIX o qualsiasi altra cosa, o si può solo ottenere qualcosa che funziona davvero e andare avanti con la vita.

  • L'utilizzo di qualsiasi delle soluzioni di cui sopra fallito su Mountain Lion (compreso quello contrassegnato come la risposta corretta). Tutti i link di download per "Diff-Npatch" fallito. (Ho trovato http://webperso.easyconnect.fr/bdesgraupes/tools.html ma davvero non mi piace l'idea di dover ricorrere all'utilizzo di uno strumento di diff che non può essere invocato dalla riga di comando e quindi integrato con qualsiasi IDE o strumento VCS I potrebbero utilizzare, come BBEdit, SourceTree o SmartSVN - tutto dei quali, BTW, non è riuscito a ignorare a capo con il loro built-in strumento diff.

Sì, i miei ritorni a capo sono \ r, ma che importa? Arrr! Se il software è troppo stupido per capire che \ r == \ n poi Sto solo andando a utilizzare diversi software che è abbastanza intelligente.

PhpStorm era l'unico software che aveva uno strumento diff che "appena lavorato" - che è quello che mi aspetto software Mac per fare. Mi aspetto che il software Mac per solo di lavoro . Io uso un Mac in modo da poter fare il mio lavoro, invece di imparare i comandi del terminale arcani ad ogni turno, che sono quasi tutti mal documentati, è in attesa di capire quanto i comandi dovrebbero essere formattato senza esempi chiari, in modo da non si sa mai se si sta facendo male o se il comando semplicemente non funziona , proprio come tutti gli altri software cattivo. Prendete questo esempio da "man diff":

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

OK, quindi dopo aver letto questo, non ho idea di cosa significhi. Non v'è alcun esempio del suo utilizzo. Che cosa è "re"? Non dice da nessuna parte.

Poi c'è questo gioiello:

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

ho potuto fare alcun senso di questo passaggio. Qual è il "input"? E 'entrambi i file o solo il "per" file o solo il "da" un file? Ciò che è "simile", riferendosi a? Che cosa significa "è" significa nella frase, "GFMT 'è' o` LTYPE cambiato '"? Vuol dire "può essere sostituito da"? Se è così allora perché non è "GFMT" in citazioni o staffe, ecc? Dal momento che nessun esempio è dato, non c'è modo di sapere; formulazione della documentazione è totalmente ambiguo. Che cosa significa "GFMT può contenere" ... significa? Significa "contenere" significa che il testo che sostituisce l'acronimo GFMT che può contenere? Senza un chiaro esempio è completamente inutile.

Perché nemmeno la briga di scrivere una pagina di manuale, se hai intenzione di fare in modo criptico e ambiguo è inutile a chi già non sanno come utilizzare il software, in fondo? A quel punto, non è un manuale; è solo una pagina di riferimento rapido per i ragazzi che hanno scritto il software in modo che possano ricordare come usarlo. Credo che essi assumono devi semplicemente leggere il codice sorgente per sé se volete sapere che cosa realmente fa.

Il mio tempo è prezioso. Preferirei solo pagare i soldi per avere un pezzo di software che in realtà funziona in modo corretto e ha documentazione adeguata.

Perché questi tutti falliti:

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

... non è riuscito a ignorare \ r caratteri.

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

... non è riuscito a ignorare \ r caratteri.

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

... non è riuscito a ignorare \ r caratteri.

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

... non è riuscito a ignorare \ r caratteri.

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

... non è riuscito a ignorare \ r caratteri.

Del resto se fossero \ n caratteri anche fallito quando sono aggiunti i caratteri \ n.

Dove test.phtml ==

  

foo

     

bar

e rest.html ==

  

foobar

Il comando "diff" ti dà sempre qualcosa di simile:

  
     

* 1,2 ** ! pippo! bar \ No newline alla fine del file

     

--- 1 ----! foobar \ No newline alla fine del file

... fallire!

Ho usato la seguente correzione rapida, che ha inconvenienti (vedi sotto):

1 : Fare un diff e la lista solo i nomi dei file

diff -r -q dir1/ dir2/

2 :. Aprire e salvare ogni file elencato con l'editor che è stato utilizzato, questo cambierà il terminatore

3 : Fare un diff regolare

Gli svantaggi includono:

  • meno robusta, soggetto ad errori
  • più lavoro, se hai un sacco di file

Questo ha funzionato per me:

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

Sono su OSX, e ho mescolato i file da OSX e Windows. Credit: http: //www.codealpha.net/514/diff-and-ignoring-spaces-and-end-of-lines-unix-dos-eol/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top