![Convierta esta expresión regular para que sea amigable dentro de sed](https://rvso.com/image/192221/Convierta%20esta%20expresi%C3%B3n%20regular%20para%20que%20sea%20amigable%20dentro%20de%20sed.png)
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 \d
como sinónimo de [0-9]
o [:digit:]
. Algunas versiones de sed
(por ejemplo, GNU sed) lo entienden \s
como 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 -E
la 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 -n
o perl -p
en 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 123
en 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.