Tengo dos archivos de configuración, el original del administrador de paquetes y uno personalizado modificado por mí mismo. He agregado algunos comentarios para describir el comportamiento.
¿Cómo puedo ejecutar diff
los archivos de configuración, omitiendo los comentarios? Una línea comentada se define por:
- espacios en blanco iniciales opcionales (pestañas y espacios)
- signo hash (
#
) - cualquier otro personaje
Sería la expresión regular (más simple) omitiendo el primer requisito #.*
. Probé la opción --ignore-matching-lines=RE
( -I RE
) de GNU diff 3.0, pero no pude hacerlo funcionar con ese RE. También lo intenté .*#.*
y .*\#.*
sin suerte. Poner literalmente la línea ( Port 631
) como RE
no coincide con nada, tampoco ayuda a colocar el RE entre barras.
Como se sugiere en la herramienta "diff", ¿parece que falta la expresión regular de la herramienta? , Intenté grep -G
:
grep -G '#.*' file
Esto parece coincidir con los comentarios, pero no funciona diff -I '#.*' file1 file2
.
Entonces, ¿cómo debe usarse esta opción? ¿Cómo puedo hacer diff
omitir ciertas líneas (en mi caso, comentarios)? No sugiera grep
el archivo ni compare los archivos temporales.
fuente
-I
opción hace que se ignore un bloque solo si todas sus líneas coinciden con la expresión regular. Por lo tanto, puede ignorar un cambio de solo comentario de esa manera, pero no los cambios de comentario que están cerca de un cambio sin comentario.diff -I
no se comporta como esperaba. Actualicé mi respuesta con un ejemplo que me aclaró este comportamiento.Respuestas:
Según Gilles, la
-I
opción solo ignora una línea si nada más dentro de ese conjunto coincide con la coincidencia de-I
. No lo entendí completamente hasta que lo probé.La prueba
Hay tres archivos involucrados en mi prueba:
Archivo
test1
:Archivo
test2
:Archivo
test3
:Los comandos:
La forma alternativa
Como hasta ahora no hay una respuesta que explique cómo usar la
-I
opción correctamente, proporcionaré una alternativa que funciona en bash shells:diff -u
- diff unificado-B
- ignorar líneas en blanco<(command)
- una función bash llamada sustitución de proceso que abre un descriptor de archivo para el comando, esto elimina la necesidad de un archivo temporalgrep
- comando para imprimir líneas (no) que coinciden con un patrón-v
- Mostrar líneas no coincidentesE
- usa expresiones regulares extendidas'^\s*(#|$)'
- una expresión regular que coincida con comentarios y líneas vacías^
- coincide con el comienzo de una línea\s*
- unir espacios en blanco (tabuladores y espacios) si los hay(#|$)
hacer coincidir una marca hash o, alternativamente, el final de una líneafuente
Tratar:
Tenga en cuenta que la expresión regular tiene que coincidir con la línea correspondiente en ambos archivos y coincide con cada línea cambiada en el trozo para que funcione, de lo contrario, seguirá mostrando la diferencia.
Utilice comillas simples para proteger el patrón de la expansión del shell y para escapar de los caracteres reservados por expresiones regulares (por ejemplo, corchetes).
Podemos leer en el
diffutils
manual:Armel también explica bien este comportamiento aquí .
Relacionado: ¿Cómo puedo realizar una diferencia que ignore todos los comentarios?
fuente
Después de buscar en la web, la forma alternativa de Lekensteyn es la mejor que encontré.
Pero quiero usar la salida dif como parche ... y hay un problema porque el número de línea se mantiene en nota debido a "grep -v".
Así que me propongo mejorar esta línea de comando:
No es perfecto, pero el número de línea se guarda en el archivo de parche.
Sin embargo, si se agrega una nueva línea en lugar de una línea de comentario ... el comentario generará un Fallo de Hunk al parchear, como podemos ver a continuación.
prueba ahora nuestro comando
/ dev / fd / 62 & / dev / fd / 63 son archivos producidos por sustitución de procesos. La línea entre "+ nueva línea" y "-otro texto" es el carácter de espacio predeterminado definido en nuestra expresión sed para reemplazar los comentarios.
Y ahora, lo que viene cuando aplicamos este parche:
La solución es no usar el formato diff unificado sin -u
ahora parchea el archivo de trabajo (sin garantía del resultado en un proceso diff muy complejo).
fuente
diff -U0 one two
para deshabilitar el contexto. Para parchear, hay un montón de herramientas que pueden ser más adecuadas, como kdiff3.-U0
opción de deshabilitar el contexto. Nota: kdiff3 es una herramienta gráfica. Necesito una herramienta automática para administrar los atributos de git merge.vimdiff
admite combinaciones de tres vías, puede valer la pena mirar.Usualmente ignoro este desorden ya sea por:
grep -v "^#" | cat -s
y diferenciando esas o ...vim -d
para mirar los archivos. El resaltado de sintaxis se encarga de hacer que las diferencias entre comentarios y no comentarios sean bastante obvias. El resaltado de diferencias de la diferencia en línea para que pueda ver qué valores o partes de valores se han cambiado de un vistazo hace de este mi favorito.fuente
Esto es lo que uso para eliminar todas las líneas comentadas, incluso las que comienzan con una pestaña o espacio, y las en blanco:
o puedes hacer
fuente