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)'
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?
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
Uma possível solução usando sed
:
sed -n '/[A-Z]/{/[a-z]/{/[0-9]/{/[#?!@$%^&*-]/p}}}'
Tags sed regular-expression