Convierta esta expresión regular para que sea amigable dentro de sed

Convierta esta expresión regular para que sea amigable dentro de sed

Estoy intentando realizar esta expresión regular con sed, pero parece que sed no es compatible. Dice rango de caracteres no válido

echo "$info" | sed -e 's/(?:\d[\s-.]*){12,19}/*/g'

Intentar hacer coincidir cualquier rango de dígitos del 12 al 19 independientemente de los espacios en blanco, - o . caracteres

sed: 1: "s/(?:\d[\s-.]*){12,19}/ ...": RE error: invalid character range

Parece que el problema se solucionó cuando moví el guión hacia arriba en el rango de caracteres (?:\d[-\s.]*){12,19}pero no hace nada después... ¿Eso significa que esto no coincide? Pero los casos de prueba de expresiones regulares dicen lo contrario

Ejemplo:

A0000000000000000D
1234 1234 1234 1234
VISA 1234123412341234 EXP 1222 CVV 123

Respuesta1

Esta parte de la expresión regular es la fuente del error:[\s-.]

Si desea -que lo traten como un carácter más en una expresión entre corchetes, colóquelo en elcomienzoo elfinde la expresión. De lo contrario, se tratará como un rango.

Por ejemplo:

  • [a-z]significa "hacer coincidir todas las letras minúsculas de la a a la z"
  • [-az]o [az-]significa "hacer coincidir un guión, una 'a' o una 'z'"

Por cierto, ninguna versión de sed que yo conozca entiende perl-ish \dcomo sinónimo de [0-9]o [:digit:]. Algunas versiones de sed(por ejemplo, GNU sed) lo entienden \scomo sinónimo de espacios y tabulaciones ( [:blank:]), pero ciertamente no todas. y aquellos quehacerentender \s, probablemente solo entenderloafuerade expresiones entre corchetes (no conozco ninguna que lo entienda, []pero eso no significa que no haya alguna variante sed oscura que lo entienda).

Y, AFAIK, sed no entiende que Perl (?:)significa una subexpresión que no captura.

Para usar funciones de Expresión Regular Extendida (ERE) como {} sin escapar de ellas como \{y \}, necesita usar -Ela opción de sed (y escapar de ellas podría ser una extensión GNU, como lo es para \+, por lo que puede no funcionar para todas las versiones de sed).

Para hacer coincidir 12-19 dígitos quepodríacontienen espacios o guiones y los reemplaza con asteriscos, primero debe eliminar los espacios y los guiones y luego intentar hacer coincidir entre 12 y 19 dígitos. p.ej

echo "$info" | sed -E -e 's/[[:blank:]-]//; s/[[:digit:]]{12,19}/*/g'

NOTA: Si no le importa la portabilidad y es probable que nunca trabaje con versiones antiguas o propietarias de sed, esto estará bien. De lo contrario, siga las Expresiones regulares básicas (BRE) o use perl -no perl -pen lugar de sed(y definitivamente use perl si desea usar el dialecto de expresiones regulares de Perl).

También tenga en cuenta que esto afectará a la totalidad de lo que esté en $info, por lo que se eliminarán todos los espacios y guiones. Dependiendo de lo que haya en $info, es posible que esto no sea lo que desea.

Si es probable que $info contenga otro texto (por ejemplo, VISA 1234123412341234 EXP 1222 CVV 123en lugar de just 1234123412341234), entonces probablemente debería usar awk o perl en lugar de sed para poder trabajar fácilmente con cada campo individual en lugar de con la línea completa.

información relacionada