Saltar al contenido principal

REPLACE

Reemplaza valores en registros de un archivo IPM.

Sintaxis

$ cardak help replace
usage: cardak replace --search=SEARCH --replace=REPLACE [<flags>] <files>...

Search and replace values in files

Flags:
--help Show context-sensitive help (also try --help-long and --help-man).
-v, --verbose Add more information displayed on some commands.
--mono Supress color on output.
--ignore Try to ignore some errors and continue processing the file
-W, --width Ignore small terminal width check and force execution
-z, --silent Suppress all output (banner, headers, summary) except the results. Specially useful for DESCRIBE command piped to a search utility
like fzf
-s, --search=SEARCH Value of condition to search for
-r, --replace=REPLACE Value to use for the sustitution
-R, --records=RECORDS List of record numbers to be Searched. Values are separated by comma (,) and ranges are indicated by the starting and ending record
separated by a hyphen (-)
-F, --fields=FIELDS List of IPM fields to be searched (can use a filter name)
-l, --last Use the record numbers returned on the last GREP command

Args:
<files> File names to search and replace

Descripción

Este comando permite reemplazar valores en un archivo IPM. Es una combinación de búsqueda y reemplazo pero muy flexible ya que se puede limitar los lugares donde realizar ese reemplazo o hacerlo en todo el archivo.

El comportamiento va a cambiar dependiendo de la presencia o ausencia de algunos flags que veremos a continuación.

La forma de utilizar este comando es la siguiente:

Además de indicar el comando (REPLACE), se debe especificar el nombre del archivo donde efectuar el reemplazo. También deben estar presentes los flags --search y --replace que son mandatorios.

El flag --search indica el valor a buscar, y el flag --replace indica el valor a reemplazar.

La búsqueda puede ser global o limitarse a ciertos criterios como ser registros o rango de registros, y tambien determinados campos.

Reemplazo global

Si no se especifica ningún flag extra, la búsqueda va a ser global, es decir, se va a buscar en todos los registros y en todos los campos.

Veamos el funcionamiento con un ejemplo. Tenemos un archivo que contiene transacciones realizadas en un comercio que en su nombre sabemos que contiene la palabra bochita

Primero realizamos una búsqueda para estar seguros que es el archivo correcto, y para ello usamos el comando GREP

Ejemplo de uso del comando REPLACE

Vemos que, efectivamente, hay 6 registros en el archivo que contienen esa palabra, y además en todos los casos está presente en el campo DE043.

Vamos entonces a reemplazar todo lo que diga bochita por Piedrita

Ejemplo de uso del comando REPLACE

La salida nos indica que se realizaron 6 reemplazos (lo que coincide con la cantidad de registros que habíamos encontrado), y el nuevo archivo se ha nombrado agregando _REP.ipm al nombre original.

Para comprobar, vamos a buscar en este nuevo archivo la palabra original, o sea, bochita

Ejemplo de uso del comando REPLACE

Vemos que esa palabra no está presente, por lo que vamos a comprobar si la nueva palabra sí está, y que el reemplazo se haya realizado correctamente.

Ejemplo de uso del comando REPLACE

Y efectivamente, en el nuevo archivo generado ya no está más la palabra original, y ha sido reemplazada por la palabra solicitada.

Reemplazo limitado

El reemplazo global puede ser útil en algunos casos, como por ejemplo este en que necesitamos cambiar el nombre de un comercio en todos los registros que aparezca, y es muy improbable que ese valor esté presente en otros campos. Pero no siempre es el caso y puede ser peligros realizar cambios masivos globales.

Podemos limitar el reemplazo a determinados registros o campos, o a una mezcla de ambos.

Para limitar los registros en que queremos efectuar el reemplazo, tenemos el flag --records (-R), y para especificar los campos tenemos el flag --fields (-F).

Si solamente está presente el flag --records, la búsqueda y reemplazo va a ser hecha solamente en esos registros pero en todos los campos del mismo.

Si solamente está presente el flag --fields, la búsqueda y reemplazo va a ser hecha en todos los registros pero solamente en los campos especificados.

Si ambos flags están presentes, la búsqueda y reemplazo solamente va a ser hecha en los registros indicados y en los campos de esos registros que hayan sido especificados, lo que sería la limitación mas restrictiva de todas.

Veamos un ejemplo que nos muestra un uso probable y cotidiando. Vamos a buscar una transacción de la que conocemos el monto y veremos la forma de ir refinando la búsqueda y reemplazo

Para este ejemplo sabemos que la transacción fue hecha por un monto de 600.00

Buscamos en el archivo ese valor. Como sabemos que se usan dos decimales, la búsqueda va a ser por el valor "60000" que incluye los dos decimales.

Ejecutamos el comando

cardak grep '60000' file9

Ejemplo de uso del comando REPLACE

Vemos que se encuentran 52 registros con ese valor, pero no solo se incluyen los montos sino que también aparece ese mismo valor en otros campos, como ser algunos PDS (es común que valores numéricos aparezcan repetidos en varios campos como strings parciales).

Vamos a restringir la búsqueda para que solamente considere el campo donde viene el importe, o sea, el DE004

cardak grep '60000' -F DE004 file9

Ejemplo de uso del comando REPLACE

Ahora hemos disminuido la cantidad de coincidencias a 22. Pero observamos que si bien estamos buscando solamente en el campo DE004, se encuentran coincidencias con valores que no son exactos, porque la coincidencia es cierta cuando el valor buscado está contenido dentro del valor total. Por lo tanto, cualquier valor que contenga "60000" en cualquier posición va a ser una coincidencia válida. Vemos por ejemplo que valores como 3600.00 o 1600.00 también coinciden, y en general cualquier monto que contenga "60000" sería una coincidencia. Por ejemplo si tuviéramos un valor de 60000.15 también lo consideraría como una coincidencia.

Para ello podemos (y se sugiere hacerlo), utilizar una expresión regular para la búsqueda. En nuestro caso, queremos que a la izquierda del valor solamente hayan ceros, y que el valor buscado esté al final de la cadena. Utilizaremos entonces el comando de la siguiente forma:

cardak grep '^0+60000$' -F DE004 file9

Ejemplo de uso del comando REPLACE

Hemos bajado las coincidencias a 15 registros, y ahora todos corresponden con el importe indicado. Refinemos la búsqueda utilizando otros datos de la transacción buscada. Podemos Imprimir los registros encontrados hasta ahora mostrando otros campos, por ejemplo mostrando el PAN y el comercio:

cardak grep '^0+60000$' file9 -F D4 -I D2,D43

Ejemplo de uso del comando REPLACE

Encontramos la transacción, es la realizada por 600.00 con la tarjeta terminada en '6172' y que se hizo en un comercio llamado 'Mac'. Es el registro 8259

Ahora si, podemos cambiar el importe por, digamos, 610.50 (no es una operación realista porque generaría diferencias en el settlement, pero aquí solo nos interesa ver la capacidad de modificar datos en los registros de un archivo)

También verificamos el resultado mirando el registro en el archivo modificado.

Ejemplo de uso del comando REPLACE

Criterios de búsqueda

El valor a buscar puede indicarse como un valor constante, o utilizar expresiones regulares. Las expresiones regulares, como hemos visto, son útiles cuando el valor que buscamos puede estar incluído en otros valores y necesitamos ser más específicos respecto a lo que estamos buscando.

La búsqueda puede ser:

  • Global - El valor se busca en todos los registros y campos
  • Por registro - El valor se busca solamente en los registros indicados
  • Por campo - Solamente se consideran los registros indicados para la búsqueda
  • Por registro y campo - La más restrictiva, solamente se busca en los campos indicados en los registros indicados

También podemos utilizar el resultado del ultimo GREP realizado utilizando el flag --last (-L) para limiar el reemplazo en los registros devueltos por el último comando GREP sin necesidad de especificar manualmente los registros usando el flag --records (-R).