Ordres del preprocessador

El KDiff3 admet dues opcions del preprocessador.

Ordre del preprocessador:

Quan es llegeix qualsevol fitxer, es canalitzarà a través d'aquesta ordre externa. La sortida d'aquesta ordre serà visible en lloc del fitxer original. Podeu escriure el vostre propi preprocessador que satisfaci les vostres necessitats específiques. Empreu-la per a retallar parts pertorbadores del fitxer, o per a corregir automàticament el sagnat, etc.

Ordre del preprocessador de coincidència de les línies:

Quan es llegeix qualsevol fitxer, es canalitzarà a través d'aquesta ordre externa. Si també s'especifica una ordre del preprocessador (vegeu a dalt), llavors la sortida del preprocessador serà l'entrada del preprocessador de coincidència de les línies. La sortida només s'utilitzarà en l'anàlisi durant la fase de coincidència de les línies. Podeu escriure el vostre propi preprocessador que satisfaci les vostres necessitats específiques. Cada línia d'entrada haurà de tenir una línia de sortida corresponent.

La idea és permetre a l'usuari una major flexibilitat mentre configura el resultat de les diferències. Però això requereix un programa extern, i molts usuaris no volen escriure'n un ells mateixos. La bona notícia és que molt sovint sed o perl faran la feina.

Exemple: un cas senzill de prova: es considera el fitxer a.txt (6 línies):

aa
      ba
      ca
      da
      ea
      fa

I el fitxer b.txt (3 línies):

cg
      dg
      eg

Sense un preprocessador, les següents línies es col·locarien una a una al costat de l'altra:

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

Probablement això no sigui desitjable perquè la primera lletra conté la informació realment interessant. Per a ajudar a l'algoritme de coincidència a ignorar la segona lletra, podem utilitzar una ordre de preprocessador per a la coincidència de les línies, que substitueixi «g» amb «a»:

sed 's/g/a/'

Amb aquesta ordre, el resultat de la comparació serà:

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

Internament, l'algoritme de coincidència veu els fitxers després d'executar el preprocessador de coincidència de les línies, però a la pantalla el fitxer no canviarà. (El preprocessador normal també canviarà les dades a la pantalla).

Bàsics al sed

Aquesta secció només presenta algunes característiques molt bàsiques de sed. Per a més informació, vegeu info:/sed o https://www.gnu.org/software/sed/manual/html_mono/sed.html. Trobareu una versió precompilada per a Windows® a http://unxutils.sourceforge.net. Recordeu que els següents exemples suposen que l'ordre sed es troba en alguna carpeta a la variable d'entorn PATH. Si aquest no és el cas, haureu d'especificar el camí absolut per a l'ordre.

En aquest context, només s'utilitza l'ordre sed com a ordre de substitució:

sed 's/EXPRESSIÓ_REGULAR/SUBSTITUCIÓ/ETIQUETES'

Abans d'utilitzar una ordre nova dins del KDiff3, primer haureu de provar-ho a la consola. Aquí l'ordre echo és d'utilitat. Exemple:

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

Aquest exemple mostra una ordre de sed molt senzilla que substitueix la primera ocurrència de «a» amb «o». Si voleu substituir-les totes, llavors necessitareu l'etiqueta «g»:

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

El símbol «|» és l'ordre de canonada que transfereix la sortida de l'ordre anterior a l'entrada de la següent ordre. Si voleu provar amb un fitxer més llarg, podreu utilitzar l'ordre cat en els sistemes similars a UNIX® o type en els sistemes similars a Windows®. L'ordre sed farà la substitució de cada línia.

cat nom_fitxer | sed opcions

Exemples per a sed emprats al KDiff3

Ignorar els altres tipus de comentaris

Actualment, el KDiff3 només comprèn els comentaris a C/C++. Utilitzant l'opció Ordre del preprocessador de coincidència de les línies: també podreu ignorar altres tipus de comentaris, convertint-los en comentaris a C/C++.

Exemple: per a ignorar els comentaris que comencen amb «#», us agradarà convertir-los a «//». Recordeu que també haureu d'habilitar l'opció Ignora els comentaris de C/C++ (tracta'ls com a espais en blanc) perquè tingui efecte. Una ordre apropiada per a l'Ordre del preprocessador per a la coincidència de les línies: seria:

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

Com que per a sed, el caràcter «/» té un significat especial, cal col·locar el caràcter «\» abans de cada «/» a la cadena de substitució. De vegades es requereix «\» per a afegir o eliminar un significat especial de certs caràcters. Les cometes simples «'» només són importants quan es prova a l'intèrpret d'ordres, ja que en cas contrari intentarà processar alguns caràcters. El KDiff3 no fa això excepte per a les seqüències d'escapament «\"» i «\\».

Diferències sense distingir majúscules i minúscules

Utilitzeu la següent Ordre del preprocessador per a la coincidència de les línies: per a convertir tota l'entrada a majúscules:

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

Aquí el «.*» és una expressió regular que coincideix amb qualsevol cadena i en aquest context coincideix amb tots els caràcters de la línia. El «\1» a la cadena de substitució es refereix al text coincident dins el primer parell de «\(» i «\)». La «\U» converteix el text inserit en majúscules.

Ignorar les paraules clau del control de versions

El CVS i altres sistemes per al control de versions utilitzen diverses paraules clau per a inserir cadenes generades automàticament (info:/cvs/Keyword substitution). Tots segueixen el patró «$PARAULA_CLAU text generat$». Ara necessitem una ordre del preprocessador per a la coincidència de les línies que només elimini el text generat:

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

Aquí el «.*» és una expressió regular que coincideix amb qualsevol cadena i en aquest context coincideix amb tots els caràcters de la línia. El «\1» a la cadena de substitució es refereix al text coincident dins el primer parell de «\(» i «\)». La «\U» converteix el text inserit en majúscules.

Mentre experimenteu amb sed, podríeu arribar a comprendre fins i tot aquestes expressions regulars. Són útils perquè hi ha molts altres programes que també admeten coses similars.

Ignorar els números

Ignorar els números en realitat és una opció integrada. Però com un altre exemple, així és com es veuria com a ordre del preprocessador de coincidència de les línies.

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

Qualsevol caràcter dins de «[» i «]» serà una coincidència i serà substituït per res.

Ignorar certes columnes

De vegades, un text té un format molt estricte i conté columnes que sempre voleu ignorar, mentre que hi ha altres columnes que voldreu conservar per a la seva anàlisi. En el següent exemple, s'ignoren les primeres cinc columnes (caràcters), es conserven les següents deu columnes, després de nou s'ignoren cinc columnes i es conserva la resta de la línia.

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

Cada punt «.» coincidirà amb qualsevol caràcter individual. El «\1» i «\2» a la cadena de substitució es refereixen al text coincident dins del primer i segon parell de «\(» i «\)» denotant el text a conservar.

Combinar diverses substitucions

De vegades voldreu aplicar diverses substitucions alhora. Després podreu utilitzar el punt i coma «;» per a separar les unes de les altres. Exemple:

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

Emprar perl en comptes de sed

En comptes de sed, possiblement voldreu utilitzar una mica més com perl.

perl -p -e 's/EXPRESSIÓ_REGULAR/SUBSTITUCIÓ/ETIQUETES

Però alguns detalls són diferents en perl. Recordeu que on sed necessitava «\(» i «\)» el perl requereix el més simple «(» i «)» sense precedir «\». Exemple:

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

Ordre d'execució del preprocessador

En la següent ordre, les dades es canalitzen a través de tots els preprocessadors interns i externs:

  • Prepocessador normal,

  • Preprocessador de coincidència de les línies,

  • Ignora les majúscules/minúscules (tracta-les com a espais en blanc) (conversió a majúscules),

  • Detecció dels comentaris a C/C++,

  • Ignora els números (tracta'ls com a espais en blanc),

  • Ignora els espais en blanc

Les dades després del preprocessador normal es conservaran per a la seva visualització i fusió. Les altres operacions només modificaran les dades que vegi l'algoritme de coincidència de les línies.

En els rars casos en què utilitzeu un preprocessador normal, cal tenir en compte que el preprocessador de coincidència de les línies veurà la sortida del preprocessador normal com a una entrada.

Avís

Les ordres del preprocessador solen ser molt útils, però com amb qualsevol opció que modifiqui els textos o oculti certes diferències automàticament, pot passar per alt certes diferències accidentalment i, en el pitjor dels casos, destruir dades importants.

Per aquesta raó, durant una fusió, si s'empra una ordre del preprocessador normal, el KDiff3 dirà i us demanarà si s'ha d'inhabilitar o no. Però no us avisarà si està activada una opció Ordre del preprocessador per a la coincidència de les línies:. La fusió no es completarà fins que es resolguin tots els conflictes. Si inhabiliteu l'element de menú Vista de les diferènciesMostra els espais en blanc, també seran visibles les diferències que es van eliminar amb l'opció Ordre del preprocessador de coincidència de les línies:. Si el botó Desa roman inhabilitat durant una fusió (a causa que romanen conflictes), podreu habilitar l'element de menú Vista de les diferènciesMostra els espais en blanc. Si no voleu fusionar manualment aquestes diferències menys importants, podreu seleccionar l'element de menú FusionaEscull [A|B|C] a tots els conflictes dels espais en blanc no resolts.