Pregunta

Estoy trabajando en un Mac, con algunos archivos bastante viejos. Diferentes archivos fueron creados por los diferentes programas, por lo que algunos de ellos terminan con \ r (mac) y algunos con \ n (Unix). Quiero ser capaz de ejecutar comandos como diff, grep, etc en estos archivos, pero los que han \ r son tratados como una línea gigante. ¿alguien sabe de una versión de diff, grep, etc que funcione correctamente con todas las nuevas líneas?

ETA: Yo también les gustaría ser utilidades de Unix para que pueda utilizarlas en los scripts, emacs, etc ...

¿Fue útil?

Solución

Como dijo Jay, Diff'nPatch parece lo que busca. Alternativamente, usted puede convertir todos los finales de su '\ r' en línea '\ n' en un solo comando como el siguiente:

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

o

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

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

Otros consejos

Si utiliza diff -w ignorará espacios en blanco en los archivos, que es probablemente suficiente para sus necesidades.

Editar : acabo de dar cuenta leí mal el cargo por primera vez y en realidad se está buscando un diff que trabajará con los finales de línea \r. 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 la GNU 'diff', 'parche' y 'cmp'   servicios públicos. Se le permite comparar y   encontrar las diferencias entre dos archivos o   carpetas, cotejar dos archivos, generan   diferenciaciones en varios formatos (normal,   contexto, unidiff, etc.), se aplican   parches, comparar archivos byte a byte.   Puede manejar cualquier tipo de finales de línea   (Mac, Unix o Windows)

El diff incluido con OS X Lion tiene una opción 'tira-arrastrar-cr' que hace que desea. Lo usa de esta manera:

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

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 todas las plataformas que se pueda imaginar y puede ejecutarse en un montón de archivos a la vez. Creo que hay un paquete disponible para Mac.

de "ignorar los espacios en blanco" diff vista de PhpStorm simplemente funciona . No tiene en cuenta automáticamente las diferencias en el retorno de carro / EOL / salto de línea / lo que usted quiera. Puede perder el tiempo jugando con arcano de comandos UNIX o lo que sea, o usted podría conseguir algo que realmente funciona y seguir adelante con la vida.

  • El uso de cualquiera de las soluciones mencionadas anteriormente fallado en Mountain Lion (incluido el marcado como la respuesta correcta). Todos los enlaces de descarga para "Diff-npatch" fracasaron. (Lo que encontrar http://webperso.easyconnect.fr/bdesgraupes/tools.html pero realmente no me gusta la idea de tener que recurrir al uso de una herramienta de diferencias que no se puede invocar desde la línea de comandos y así integrarse con cualquier IDE o herramienta de VCS que podría estar utilizando, como BBEdit, SourceTree o SmartSVN - todo de 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 de que \ r == \ n entonces yo sólo voy a utilizar diferentes programas informáticos que es lo suficientemente inteligente.

PhpStorm era el único software que tenía una herramienta de diferencias que "acabo de trabajar" - que es lo que espero de software de Mac a hacer. Espero que el software de Mac a sólo el trabajo . Yo uso un Mac para que pueda hacer mi trabajo en vez de aprender los comandos de terminal arcanos a cada paso, que son casi todos mal documentado, se espera que entender cómo se supone que los comandos para ser formateado sin ningún tipo de ejemplos claros, por lo que nunca se sabe si lo estás haciendo mal o si el comando simplemente no funciona al igual que todos los demás software mal. 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 ningún ejemplo de su uso. ¿Qué es "RE"? No dice en cualquier lugar.

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

Yo podría hacer ningún sentido de este pasaje. ¿Cuál es la "entrada"? Es que ambos archivos o únicamente el archivo "a" o simplemente el "de" presentar? Lo que es "similar" se refiere a? ¿Qué significa "es" significa en la frase, "GFMT 'es' o` LTYPE cambiado '"? Qué significa "puede ser reemplazado por"? Si es así, ¿por qué no es "GFMT" entre comillas o corchetes etc.? Puesto que no se da ningún ejemplo, no hay manera de saber; redacción de la documentación es totalmente ambigua. ¿Qué significa "GFMT puede contener" ... significa? Significa "contener" significa que el texto que sustituya al GFMT sigla que puede contener? Sin un claro ejemplo de ello es completamente inútil.

¿Por qué se molestó en escribir una página de manual si se va a hacer que sea tan críptico y ambiguo que es inútil cualquier persona que no tenga ya saben cómo utilizar el software, básicamente? En ese momento, no es un manual; es sólo una página de referencia rápida para los chicos que escribieron el software para que puedan recordar cómo usarlo. Supongo que asumen que usted acaba de leer el código fuente en sí, si usted quiere saber lo que realmente hace.

Mi tiempo es valioso. Yo prefiero pagar el dinero para tener una pieza de software que funciona correctamente y tiene la documentación apropiada.

Debido a que estos fracasado:

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

... no hacer caso de \ r caracteres.

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

... no hacer caso de \ r caracteres.

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

... no hacer caso de \ r caracteres.

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

... no hacer caso de \ r caracteres.

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

... no hacer caso de \ r caracteres.

Por lo demás, si se \ n caracteres también fallaron cuando se añaden los caracteres \ n.

Cuando test.phtml ==

  

foo

     

bar

y rest.html ==

  

foobar

El comando "diff" siempre te da algo como:

  
     

* 1,2 ** ! foo! Bar \ n newline al final del archivo

     

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

... fallar!

I utilizó la siguiente solución rápida, que tiene inconvenientes (véase más adelante):

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

diff -r -q dir1/ dir2/

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

3 : Hacer un diff regulares

Las desventajas incluyen:

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

Esto funcionó para mí:

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top