2009-02-12 19 views
19

Estoy trabajando en un mac, con algunos archivos bastante antiguos. Diferentes archivos fueron creados por diferentes programas, por lo que algunos terminan con \ r (mac) y algunos con \ n (unix). Quiero poder ejecutar comandos como diff, grep, etc. en estos archivos, pero los que tienen \ r se tratan como una línea gigante. ¿Alguien sabe de una versión de diff, grep, etc. que funcione correctamente con todas las líneas nuevas?line-end agnostic diff?

ETA: También me gustaría que fueran utilidades de Unix para que pueda utilizarlas en los scripts, emacs, etc ...

Respuesta

8

Como dijo Jay, Diff'nPatch parece ser lo que estás buscando. Alternativamente, usted puede convertir todos los finales de su '\ r' de línea en '\ n' en un solo comando como este:

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

o

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

(Es posible que desee filtrar la lista de archivos en . alguna manera en el último caso o se va a aplicar a todos los archivos en todos los subdirectorios)

+0

Si tiene algún archivo con el estilo de Windows \ r \ n, esto terminará reemplazando cada salto de línea de Windows con \ n \ n, que probablemente no sea el efecto deseado. – Jay

+0

Cierto, pero estaba teniendo en cuenta que solo mencionó las terminaciones de línea de estilo Mac y Unix ... – UncleZeiv

+1

no, son todas las Macs, y ya tenía una mac2unix que era muy similar (utiliza tr en lugar de sed, pero sí ... .) –

11

Si utiliza diff -w se ignoran los espacios en blanco en los archivos, que es probablemente suficiente para tus necesidades

EDIT: acabo de dar cuenta de que leí mal la publicación la primera vez y que realmente está buscando una diferencia que funcione con \r terminaciones de línea. Mi sugerencia sería convertir los archivos con algo como flip que puede convertir los archivos a un formato estándar \n.

EDIT 2: Acabo de encontrar algo que se parece a lo que quiere - Diff'nPatch:

Diff'nPatch es un puerto para el Macintosh de 'diff' GNU, 'parche' y 'cmp ' utilidades. Le permite comparar y encontrar diferencias entre dos archivos o carpetas , cotejar dos archivos, generar diffs en varios formatos (normal, contexto, unidiff, etc.), aplicar parches, comparar archivos byte por byte. , puede manejar cualquier tipo de finales de línea (Mac, UNIX o Windows)

+0

no. -w simplemente ignora el espacio en blanco EN LA LÍNEA. luego trata el archivo \ r como una gran línea, sin los \ r's. el archivo \ n sigue siendo un grupo de líneas diferentes. –

+0

parece que el enlace para Diff'nPatch ahora es http: //download.cnet.com/Diff-npatch/3000-2247_4-36909.html – yanjost

+5

Para archivos Unix vs Dos, -w funciona de maravilla. ¡Gracias! – Chris

1

El comando dos2unix podría ser útil en la conversión de los archivos a un formato coherente en primer lugar. Creo que está disponible para casi cualquier plataforma que se te ocurra y puede ejecutarse en muchos archivos a la vez. Creo que hay un paquete disponible para mac.

+0

hm, pero mac ('\ r') no es dos ('\ r \ n') ni unix ('\ n') ... – UncleZeiv

+0

Existe algún soporte para archivos con formato mac en dos2unix mediante la opción convmode. Con esto en mente, puede ser posible crear una conversión consistente (y separada) con el propósito de diferir/grepping. – Rog

+0

De hecho, escribí un Mac2unix hace un tiempo, y eso terminó siendo la mejor solución ... –

0

que utiliza la siguiente solución rápida, que tiene inconvenientes (ver más abajo):

: Haz una lista de diferencias y sólo los nombres de archivo

diff -r -q dir1/ dir2/ 

: abrir y guardar cada archivo que aparece con el editor que se utilizó, esto va a cambiar los finales de línea.

: hacer un diff normal

desventajas incluyen:

  • menos robusto, propenso a errores
  • trabajo más si tiene un montón de archivos
+0

Mejor automatizar el paso 2 con dos2unix o voltear o algo –

6

El diff incluido con OSX Lion tiene una opción 'strip-trailing-cr' que hace lo que quiere. Lo usa de esta manera:

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

Esto no funciona. – CommaToast

+0

Las opciones también están disponibles en Linux. – kenorb

+1

quitará la cr en la SALIDA de diff, no en la entrada. –

-1

Esto funcionó para mí:

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

estoy en OSX, y se han mezclado los archivos de OS X y Windows. Crédito: diff de vista http://www.codealpha.net/514/diff-and-ignoring-spaces-and-end-of-lines-unix-dos-eol/

+0

Esto no funciona. Si el archivo A contiene "foo \ rbar" y el archivo B contiene "foobar" aparecerán como diferentes. El punto es * ignorar todo el espacio en blanco, incluidos los retornos de carruaje! * – CommaToast

+0

Creo que eso no está bien. Si tienes dos archivos con 'foo bar' y' foobar', ¿no dirías que son diferentes? –

+0

Tienes razón, en este contexto, es diferente. Llegué a esta página debido a la búsqueda de una forma de ignorar las líneas nuevas cuando su adición es el único cambio en un archivo, por lo que, por ejemplo, JSON embellecido no se trataría como diferente de la forma no embellecida del mismo JSON. Por supuesto, con algo como YAML, donde no hay una forma "no pretificada", los caracteres de nueva línea son vitales. Debería haberlo leído más de cerca antes de comentar ... demasiadas pestañas ... – CommaToast

2

de PhpStorm "ignoran los espacios en blanco" simplemente funciona. Ignora automáticamente las diferencias en el retorno de carro/EOL/newline/what-have-you. Puede perder el tiempo jugando con los comandos arcanos Unix o lo que sea, o simplemente puede obtener algo que realmente funciona y seguir adelante con la vida.

  • El uso de cualquiera de las soluciones mencionadas anteriormente falló en Mountain Lion (incluida la marcada como la respuesta correcta). Todos los enlaces de descarga para "Diff-npatch" fallaron. (Encontré http://webperso.easyconnect.fr/bdesgraupes/tools.html pero realmente no me gusta la idea de tener que recurrir al uso de una herramienta diff que no se puede invocar desde la línea de comandos y así integrar con cualquier herramienta IDE o VCS que pueda estar usando, como BBEdit, SourceTree, o SmartSVN - todos los cuales, por cierto, no hacer caso omiso de las nuevas líneas con su herramienta integrada de diff

Sí, mis saltos de línea son \ r, pero ¿y qué Arrr Si el software es demasiado estúpido para darse cuenta.?! que \ r == \ n entonces yo sólo voy a utilizar diferentes programas informáticos que es lo suficientemente inteligente como

PhpStorm era el único software que tenía una herramienta de diferencias que "sólo funcionó." - que es lo que esperaba Software Mac para hacer. Espero Mac soft ware a simplemente trabaja. Utilizo una Mac para poder hacer mi trabajo en lugar de aprender los comandos de la terminal arcana en cada vuelta, que están casi todos mal documentados, esperando que entiendas cómo deben formatearse los comandos sin ningún ejemplo claro, por lo que nunca se sabe si lo estás haciendo mal o si el comando simplemente no funciona como cualquier otro software defectuoso. Tome este ejemplo de "hombre diff":

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

OK, así que después de leer esto, no tengo ni idea de lo que significa. No hay un ejemplo de su uso. ¿Qué es "RE"? No dice en ninguna parte.

Luego está esta joya:

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

que podría hacer ningún sentido de este pasaje. ¿Cuál es la "entrada"? ¿Son ambos archivos o solo el archivo "para" o solo el archivo "de"? ¿A qué se refiere "similar"?¿Qué significa "es" en la oración, "GFMT" es "LTYPE o` cambiado '"? ¿Significa que "puede ser reemplazado por"? Si es así, ¿por qué no está "GFMT" entre comillas o corchetes, etc.? Como no se da ningún ejemplo, no hay forma de saberlo; la redacción de la documentación es totalmente ambigua. ¿Qué significa "GFMT puede contener" ... significa? ¿"Contener" significa que el texto que reemplaza el acrónimo GFMT puede contener eso? Sin un claro ejemplo, es completamente inútil.

¿Por qué siquiera molestarse en escribir una página de hombre si la va a hacer tan críptica y ambigua que es inútil para cualquiera que no sepa cómo usar el software, básicamente? En ese punto, no es un manual; es solo una página de referencia rápida para los tipos que escribieron el software para que puedan recordar cómo usarlo. Supongo que suponen que solo leerá el código fuente si quiere saber qué es lo que realmente hace.

Mi tiempo es valioso. Preferiría simplemente pagar el dinero para tener un software que realmente funcione correctamente y tenga la documentación adecuada.

Debido a que estos todos fracasaron:

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

... no pudieron ignorar \ r caracteres.

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

... no se pudieron omitir los caracteres \ r.

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

... no se pudieron omitir los caracteres \ r.

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

... no se pudieron omitir los caracteres \ r.

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

... no se pudieron omitir los caracteres \ r.

De hecho, si fueran \ n caracteres, también fallaron cuando se agregaron \ n caracteres.

Dónde test.phtml ==

foo

bar

y == rest.html

foobar

El comando "diff" siempre te da algo así como:


* 1,2 **! foo! bar \ Sin nueva línea al final del archivo

--- 1 ----! foobar \ Sin nueva línea al final del archivo

... ¡falló!

+0

RE es una expresión regular. –