Por que o padrão de regex '?!' não está trabalhando com grep? [duplicado]

0

Poderíamos usar -v para excluir uma única palavra de um arquivo, mas estou me perguntando por que o padrão de regex ?! não está funcionando com grep / egrep .

Eu estava procurando um padrão para excluir uma única palavra da minha pesquisa em um arquivo no atom editor e encontrei este link. O ?! funciona perfeitamente em atom . Em bash , tive de desativar histexpand com set +H primeiro, caso contrário, você obterá -bash: !xxx: event not found as !pattern pesquisar o histórico. Depois disso, tentei coisas como echo "no" | grep "^(?!yes).*" , mas grep de alguma forma não reconhece o padrão ?! - por que isso acontece?

    
por chevallier 11.05.2018 / 19:40

1 resposta

4

$ echo "no" | grep -P '^(?!yes).*'
no

A expressão não é uma expressão regular estendida básica nem padrão, mas uma PCRE, uma "expressão regular compatível com Perl". O GNU grep sabe disso se você usar o utilitário com seu -P flag.

Colocar a expressão entre aspas simples (o que você deve fazer, uma vez que é uma string estática) também impede que bash reconheça o ?!yes como um padrão de expansão de histórico.

Do manual GNU grep :

-P, --perl-regexp

Interpret the pattern as a Perl-compatible regular expression (PCRE). This is experimental and grep -P may warn of unimplemented features.

Do manual bash (minha ênfase):

Only backslash (\) and single quotes can quote the history expansion character, but the history expansion character is also treated as quoted if it immediately precedes the closing double quote in a double-quoted string.

    
por 11.05.2018 / 19:44