Órdenes del preprocesador

KDiff3 permite dos opciones para el preprocesador.

Orden del preprocesador:

Cuando se lee cualquier archivo, se redirigirá a través de esta orden externa. Se podrá ver la salida de esta orden en lugar del archivo original. Puede escribir su propio preprocesador que cubra sus necesidades específicas. Utilice esto para cortar determinadas partes del archivo, o para corregir de forma automática el sangrado, etc.

Orden de preprocesador de coincidencia de línea:

Cuando se lee cualquier archivo, se redirigirá a través de esta orden externa. Si se especifica una orden de preprocesado (ver a continuación), la salida del preprocesador será la entrada de la coincidencia de líneas del preprocesador. La salida solo se utilizará durante la fase de coincidencia de líneas durante el análisis. Puede escribir su propio preprocesador que cubra sus necesidades específicas. Cada línea de entrada tendrá la correspondiente línea de salida.

La idea es permitir al usuario gran flexibilidad durante la configuración del resultado de diff. Pero necesita un programa externo, y muchos usuarios no quieren escribirlo ellos. La buena noticia es que muchas veces sed o perl harán este trabajo.

Ejemplo: Prueba de mayúsculas sencilla: considerar el archivo a.txt (6 líneas):

      aa
      ba
      ca
      da
      ea
      fa

y el archivo b.txt (3 líneas):

      cg
      dg
      eg

Sin un preprocesador las siguientes líneas se situarán unas al lado de otras:

      aa - cg
      ba - dg
      ca - eg
      da
      ea
      fa

Esto no es lo que probablemente lo que se desea, ya que la primera letra contiene realmente información interesante. Para ayudar al algoritmo de coincidencias a ignorar la segunda letra podemos utilizar una orden de preprocesador, que reemplace «g» con «a»:

   sed 's/g/a/'

Con esta orden el resultado del a comparación será:

      aa
      ba
      ca - cg
      da - dg
      ea - eg
      fa

Internamente el algoritmo de coincidencia ve los archivos después de la ejecución de la línea del preprocesador de coincidencia, pero en la pantalla el archivo continúa sin cambios (el preprocesador normal cambiará también los datos en la pantalla).

Lo básico de sed

Esta sección solo introduce algunas características muy básicas de sed. Para obtener más información consulte info:/sed o http://www.gnu.org/software/sed/manual/html_mono/sed.html. Una versión precompilada para Windows puede encontrarse en http://unxutils.sourceforge.net. Tenga en cuenta que los siguientes ejemplos asumen que la orden sed se encuentra en algún directorio definido en la variable de entorno PATH. Si este no es el caso, deberá especificar la ruta completa absoluta de lo orden.

En este contexto solo se utiliza la orden de sustitución sed:

   sed 's/REGEXP/REEMPLAZO/MODIFICADORES'

Antes de utilizar una orden nueva con KDiff3, debería comprobarla en una consola. Aquí será práctica la orden echo. Ejemplo:

   echo abrakadabra | sed 's/a/o/'
   -> obrakadabra

Este ejemplo muestra una orden sed muy simple que reemplaza la primera aparición de «a» con «o». Si desea reemplazar todas las apariciones necesitará el modificador «g»:

   echo abrakadabra | sed 's/a/o/g'
   -> obrokodobro

El símbolo «|» es la orden de tubería que transfiere la salida de la orden anterior a la entrada de la siguiente orden. Si desea comprobar el uso con un archivo largo puede usar cat en los sistemas tipo Unix o type en los sistemas tipo Windows. sed hará la sustitución para cada línea.

cat nombrearchivo | sed opciones

Ejemplos para sed usados en KDiff3

Ignorar otros tipos de comentarios

En estos momentos KDiff3 solo entiende los comentarios de C/C++. Si usa la orden del preprocesador para coincidencia de líneas también podrá ignorar otros tipos de comentarios, convirtiéndolos en comentarios de C/C++. Por ejemplo, para ignorar los comentarios que comiencen por «#», debería convertirlos en comentarios que empiecen por «//». Tenga en cuenta que debe tener activada la opción «Ignorar comentarios de C/C++» para que tenga efecto. Una orden apropiada del preprocesador de coincidencia de líneas podría ser:

   sed 's/#/\/\//'

Al igual que para sed el carácter «/» tienen un significado especial, y es necesario poner el carácter «\» antes de cada «/» en la cadena de sustitución. Algunas veces, «\» es necesario para añadir o eliminar un significado especial de ciertos caracteres. Las comillas simples (') son importantes solo cuando se hagan pruebas en el intérprete de órdenes, ya que en caso contrario tratará de procesar algunos caracteres. KDiff3 no hará esto, excepto con las secuencias de escape «\"» y «\\».

Sensibilidad de diff a mayúsculas y minúsculas

Utilice la siguiente orden de preprocesado de coincidencia de línea para convertir todas las entradas a mayúsculas:

   sed 's/\(.*\)/\U\1/'

Aquí el «.*» es una expresión regular que incluye a todos los caracteres en la línea. El «\1» en la cadena de reemplazo hace referencia al texto que coincide con el primer par de «\(» y «\)». La «\U» convierte el texto insertado a mayúsculas.

Ignorar las claves de control de versión

CVS y otros sistemas de control de versión utilizan algunas claves para insertar cadenas automáticamente generadas (info:/cvs/Keyword sustitución). Todos ellos siguen el modelo «$CLAVE generada texto$». Ahora necesitaremos una orden de preprocesado que elimine solo el texto generado:

   sed 's/\$\(Revision\|Author\|Log\|Header\|Date\).*\$/\$\1\$/'

Las «\|» separan las posibles claves. Podría querer modificar esta lista para acomodarla a sus necesidades. La «\» before the «$» es necesaria porque de otra forma «$» coincidirá con el final de la línea.

Mientras experimenta con sed puede llegar a entender y a gustarle las expresiones regulares. Son prácticas porque hay muchos programas que permiten cosas similares.

Ignorar números

Ignorar los números en realidad es una opción de construcción. Pero como en otros ejemplos, indica el aspecto que podría tener la orden de preprocesado.

   sed 's/[0123456789.-]//g'

Cualquier carácter entre «[» y «]» será una coincidencia y no se reemplazará con nada.

Ignorar ciertas columnas

Algunas veces una texto tiene un formato muy estricto y contiene columnas que desearía ignorar, mientras que otras columnas deseará conservarlas para el análisis. En el siguiente ejemplo las primeras cinco columnas (caracteres) se ignorarán, las siguientes diez se conservarán, otras cinco se ignorarán y el resto de la línea se conservará.

   sed 's/.....\(..........\).....\(.*\)/\1\2/'

Cada punto «.» coincidirá con cualquier carácter simple. El «\1» y el «\2» en la cadena de reemplazo hacen referencia al texto coincidente dentro del primer y segundo par de «\(» y «\)» indicando el texto que se conservará.

Combinar varias sustituciones

Algunas veces deseará aplicar varias sustituciones a la vez. Puede utilizar el punto y coma «;» para separarlas unas de otras. Ejemplo:

echo abrakadabra | sed 's/a/o/g;s/\(.*\)/\U\1/'
   -> OBROKODOBRO

Utilizar perl en lugar de sed

En lugar de sed podría utilizar algo como perl.

   perl -p -e 's/EXPREG/REEMPLAZO/MODIFICADORES'

Pero algunos detalles son diferentes en perl. Tenga en cuenta que sed necesita «\(» y «\)» perl necesita solo «(» y «)» sin estar precedido de «\». Ejemplo:

sed 's/\(.*\)/\U\1/'
   perl -p -e 's/(.*)/\U\1/'

Orden de la ejecución de preprocesado

Los datos van pasando por todos los preprocesadores internos y externos en el siguiente orden:

  • Preprocesador normal.

  • Preprocesador de coincidencia de líneas.

  • Ignorar mayúsculas (conversión a mayúsculas).

  • Detección de comentarios C/C++.

  • Ignorar números.

  • Ignorar espacios en blanco.

Los datos después del preprocesador normal se conservarán para mostrarse y fusionarse. El resto de operaciones solo modificarán los datos para que los vea el algoritmo de coincidencia de líneas de diff.

En alguna ocasión cuando use el preprocesador normal se dará cuenta de que el preprocesador de coincidencia de líneas verá la salida del preprocesador normal como entrada.

Aviso

La orden de preprocesado suele ser muy práctica, pero como con cualquier opción que modifique su texto u oculte ciertas diferencias automáticamente, puede saltarse accidentalmente ciertas diferencias y en el peor de los casos destruir datos importantes.

Por esta razón, durante una fusión, si KDiff3 utiliza una orden de preprocesado normal le preguntará si desea desactivarla o no. Pero no se producirá ningún aviso si está activada la orden de preprocesado de líneas coincidentes. La fusión no se completará hasta que se resuelvan los conflictos. Si desactiva «Mostrar espacios en blanco» las diferencias eliminadas con la orden de preprocesado de líneas coincidentes también estarán visibles. Si el botón guardar continúa desactivado durante una fusión (porque aún existen conflictos), asegúrese de activar «Mostrar espacios en blanco». Si no desea fusionar estas diferencias sin importancia de forma manual puede elegir «Seleccionar [A|B|C] para todos los conflictos de espacios en blanco sin resolver» en el menú Fusionar.