Expresión regular para enmascarar los dígitos de la tarjeta de crédito en un archivo

Expresión regular para enmascarar los dígitos de la tarjeta de crédito en un archivo

¿Cuál es la forma más sencilla de enmascarar todos los números excepto los últimos 4 dígitos de un número de tarjeta de crédito en un archivo usando sed?

Usando egrep con la siguiente expresión regular podemos encontrar números de Visa, Mastercard, Discover, American Express, Diner's Club y JCB.

egrep "(?:4[0-9]{12}(?:[0-9]{3})?|5[12345][0-9]{14}|3[47][0-9]{13}|3(?:0[012345]|[68][0-9])[0-9]{11}|6(?:011|5[0-9]{2})[0-9]{12}|(?:2131|1800|35[0-9]{3})[0-9]{11})" transactions.log

Tenga en cuenta que otros números esenciales pueden estar presentes en este archivo de transacciones. Estos números no deben tocarse y están en otros formatos además de los números de tarjetas de crédito.

Ejemplo de formato de número de tarjeta de crédito: 38012345678901 Ejemplo de formato de otros números:2014-02-11 22:23, 1134-53553, 4-5-6-7-7-2

Visa: 4123456789012, 4123456789012345,41234567890123456

MasterCard: 5123456789012345, 512345678901234,51234567890123455

Descubrir: 6011123456789012, 6512345678901234, 601112345678901,60111234567890123

American Express: 341234567890123, 371234567890123, 34123456789012, 301234567890123, 3712345678901234

Club de comensales:37012345678901

JCB: 213112345678901, 180012345678901, 3512345678901234, 21311234567890, 18001234567890, , 2131123456789012, 1800123456789012, 35123456789012

¿Lo más fácil es buscar y reemplazar?

Respuesta1

Para reemplazar los primeros 10 dígitos *si, y solo si, el número tiene exactamente 14 dígitos:

sed 's/\([^0-9]\)[0-9]\{10\}\([0-9]\{4\}\)\([^0-9]\|$\)/\1**********\2\3/g'

Ejemplo:

$ echo 'foo bar 38012345678901 2014-02-11 22:23, 1134-53553, 4-5-6-7-7-2, 
  28012345678901,,,,, 3801234567890123456789 stuff' | \
  sed 's/\([^0-9]\)[0-9]\{10\}\([0-9]\{4\}\)\([^0-9]\|$\)/\1**********\2\3/g'

foo bar **********8901 2014-02-11 22:23, 1134-53553, 4-5-6-7-7-2,
  **********8901,,,,, 3801234567890123456789 stuff

Editar

Para hacer coincidir exactamente los patrones del ejemplo actualizado:

sed 's/\([^0-9]\)4[0-9]\{8\}\([0-9]\{4\}\)\([^0-9]\|$\)/\1**********\2\3/g;s/\([^0-9]\)4[0-9]\{11\}\([0-9]\{4\}\)\([^0-9]\|$\)/\1**********\2\3/g;s/\([^0-9]\)4[0-9]\{12\}\([0-9]\{4\}\)\([^0-9]\|$\)/\1**********\2\3/g;s/\([^0-9]\)5[12345][0-9]\{10\}\([0-9]\{4\}\)\([^0-9]\|$\)/\1**********\2\3/g;s/\([^0-9]\)5[12345][0-9]\{9\}\([0-9]\{4\}\)\([^0-9]\|$\)/\1**********\2\3/g;s/\([^0-9]\)5[12345][0-9]\{11\}\([0-9]\{4\}\)\([^0-9]\|$\)/\1**********\2\3/g;s/\([^0-9]\)3[47][0-9]\{9\}\([0-9]\{4\}\)\([^0-9]\|$\)/\1**********\2\3/g;s/\([^0-9]\)30[12345][0-9]\{8\}\([0-9]\{4\}\)\([^0-9]\|$\)/\1**********\2\3/g;s/\([^0-9]\)3[47][0-9]\{10\}\([0-9]\{4\}\)\([^0-9]\|$\)/\1**********\2\3/g;s/\([^0-9]\)3[47][0-9]\{8\}\([0-9]\{4\}\)\([^0-9]\|$\)/\1**********\2\3/g;s/\([^0-9]\)6011[0-9]\{8\}\([0-9]\{4\}\)\([^0-9]\|$\)/\1**********\2\3/g;s/\([^0-9]\)6011[0-9]\{9\}\([0-9]\{4\}\)\([^0-9]\|$\)/\1**********\2\3/g;s/\([^0-9]\)6011[0-9]\{7\}\([0-9]\{4\}\)\([^0-9]\|$\)/\1**********\2\3/g;s/\([^0-9]\)65[0-9]\{10\}\([0-9]\{4\}\)\([^0-9]\|$\)/\1**********\2\3/g;s/\([^0-9]\)2131[0-9]\{6,8\}\([0-9]\{4\}\)\([^0-9]\|$\)/\1**********\2\3/g;s/\([^0-9]\)1800[0-9]\{6,8\}\([0-9]\{4\}\)\([^0-9]\|$\)/\1**********\2\3/g;s/\([^0-9]\)35[0-9]\{8,10\}\([0-9]\{4\}\)\([^0-9]\|$\)/\1**********\2\3/g'

Esto para el siguiente archivo:

Example of credit card number format: 38012345678901 

Visa: 4123456789012, 4123456789012345, 41234567890123456

MasterCard: 5123456789012345, 512345678901234, 51234567890123455

Discover: 6011123456789012, 6512345678901234, 601112345678901, 60111234567890123

American Express: 341234567890123, 371234567890123, 34123456789012, 301234567890123, 3712345678901234

Diner's Club: 37012345678901

JCB: 213112345678901, 180012345678901, 3512345678901234, 21311234567890, 18001234567890, ,2131123456789012, 1800123456789012, 35123456789012

Example of other numbers format: 2014-02-11 22:23, 1134-53553, 4-5-6-7-7-2

da

Example of credit card number format: 38012345678901 

Visa: **********9012, **********2345, **********3456

MasterCard: **********2345, **********1234, **********3455

Discover: **********9012, **********1234, **********8901, **********0123

American Express: **********0123, **********0123, **********9012, **********0123, **********1234

Diner's Club: **********8901

JCB: **********8901, **********8901, **********1234, **********7890, **********7890, ,**********9012, **********9012, **********9012

Example of other numbers format: 2014-02-11 22:23, 1134-53553, 4-5-6-7-7-2

Por supuesto, la inicial 38012345678901no coincide ya que no está presente en ninguna lista de patrones de tarjetas.

información relacionada