Converta este regex para ser amigável dentro do sed

Converta este regex para ser amigável dentro do sed

Estou tentando realizar esse regex com sed, mas parece que o sed não suporta? Diz intervalo de caracteres inválido

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

Tentando corresponder qualquer intervalo de dígitos de 12 a 19, independentemente de espaços em branco, - ou . personagens

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

Parece que o problema foi corrigido quando movi o traço para cima no intervalo de caracteres para, (?:\d[-\s.]*){12,19}mas ele não faz nada depois... Isso significa que não corresponde? Mas os casos de teste regexr dizem o contrário

Exemplo:

A0000000000000000D
1234 1234 1234 1234
VISA 1234123412341234 EXP 1222 CVV 123

Responder1

Esta parte do regexp é a origem do erro:[\s-.]

Se você quiser -ser tratado como apenas mais um caractere em uma expressão entre colchetes, coloque-o no finalcomeçoou ofimda expressão. Caso contrário, será tratado como um intervalo.

Por exemplo:

  • [a-z]significa "corresponder todas as letras minúsculas de a a z"
  • [-az]ou [az-]significa "corresponder a um travessão, um 'a' ou um 'z'"

Aliás, nenhuma versão de sed que eu conheça entende o perl-ish \dcomo sinônimo de [0-9]or [:digit:]. Algumas versões do sed(por exemplo, GNU sed) entendem \scomo sinônimo de espaços e tabulações ( [:blank:]), mas certamente não todas. E aqueles quefazerentenda \s, provavelmente só entendaforade expressões de colchetes (não conheço nenhuma que entenda isso por dentro, []mas isso não significa que não exista alguma variante sed obscura que o faça).

E, AFAIK, sed não entende que perl (?:)significa uma subexpressão sem captura.

Para usar recursos de expressão regular estendida (ERE), como {} sem escapar deles como \{e \}, você precisa usar -Ea opção do sed (e escapar deles pode ser uma extensão GNU, como é para \+, portanto pode não funcionar para todas as versões do sed).

Para combinar 12 a 19 dígitos quepodercontêm espaços ou travessões e substituí-los por asteriscos, primeiro você precisa remover os espaços e travessões e, em seguida, tentar combinar 12 a 19 dígitos. por exemplo

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

NOTA: Se você não se importa com a portabilidade e provavelmente nunca lidará com versões antigas ou proprietárias do sed, tudo bem. Caso contrário, opte por Expressões Regulares Básicas (BRE) ou use perl -nor perl -pem vez de sed(e definitivamente use perl se quiser usar o dialeto de expressões regulares do perl).

Observe também que isso afetará tudo o que estiver em $info, portanto, todos os espaços e traços serão removidos. Dependendo do que está em $info, pode não ser isso que você deseja.

Se for provável que $info contenha outro texto (por exemplo, VISA 1234123412341234 EXP 1222 CVV 123em vez de just 1234123412341234), então você provavelmente deve usar awk ou perl em vez de sed para poder trabalhar facilmente com cada campo individual em vez de com a linha inteira.

informação relacionada