Escape da regex sed (1 minúscula, 1 maiúscula, 1 símbolo, 1 número) para o bash

0

O objetivo é remover todas as linhas que não contenham uma maiúscula, uma minúscula, um caractere especial e um número de um arquivo.

Não consigo executar este regex:

(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$

Como no comando bash:

sed -ri '\/(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$\/!d' rh.txt

Como o erro é:

sed: -e expression #1, char 67: unterminated address regex

Não tenho certeza do que escapar.

Alguma ajuda aqui?

    
por zed 15.06.2016 / 08:40

3 respostas

1

Não use sed para isso; use um grep inverso. Dessa forma, você pode usar as expressões no estilo PCRE nas quais você está tentando encaixar em sed (que não fala em PCRE):

grep -v -P '^(?=.*pattern1)(?=.*pattern2)'
    
por 15.06.2016 / 09:07
1

O erro que você recebeu devido à barra de escape / , que faz com que / não seja mais delimitador para o padrão de endereço.

Agora, mesmo que você não escape de / , seu regex não funcionará. sed suporta apenas BRE e ERE em alguma implementação (e se tornará padrão na próxima versão POSIX). BRE ou ERE não suportam o recurso lookahead, que você usou em seu regex (?=...) .

Para arquivar seu requisito:

LC_ALL=C sed -e '
  /[A-Z]/!d
  /[a-z]/!d
  /[0-9]/!d
  /[#?!@$%^&*-]/!d
' <file
    
por 15.06.2016 / 09:17
0

Uma possível solução usando sed :

sed -n '/[A-Z]/{/[a-z]/{/[0-9]/{/[#?!@$%^&*-]/p}}}'
    
por 15.06.2016 / 09:18