Eu tenho este regex:
(?<=prefix).*$
que retorna qualquer caractere após a string "prefix" e funciona bem em qualquer mecanismo regex online (por exemplo, https://regex101.com ). O problema é quando eu uso esse regex no bash:
grep '(?<=prefix).*$' <<< prefixSTRING
não combina com nada. Por que esse regex não funciona com grep?
Você parece ter definido o regex correto, mas não definiu os sinalizadores suficientes na linha de comando
grep
para entendê-lo. Porque por padrãogrep
suporta BRE e com-E
flag faz ERE. O que você tem (look-aheads) está disponível apenas no sabor regex PCRE, que é suportado apenas no GNUgrep
com seu-P
sinalizador.Supondo que você precise extrair apenas a string correspondente depois
prefix
de adicionar um sinalizador extra-o
para informargrep
que imprime apenas a parte correspondente comoHá também uma versão
grep
que suporta bibliotecas PCRE por padrão -pcregrep
na qual você pode simplesmente fazerExplicações detalhadas sobre vários sabores de regex são explicadas nesta maravilhosa resposta e ferramentas de Giles que implementam cada um deles
Expressões regulares vêm em muitos sabores diferentes. O que você está mostrando é uma expressão regular do tipo Perl (PCRE, "Perl Compatible Regular Expression").
grep
faz expressões regulares POSIX. Estas são expressões regulares básicas (BRE) e expressões regulares estendidas (ERE, segrep
for usado com a-E
opção). Consulte o manual parare_format
ouregex
qualquer outro manual semelhante ao qual seugrep
manual se refira em seu sistema, ou os textos padrão POSIX aos quais acabei de vincular.Se você usar GNU
grep
, poderá usar expressões regulares do tipo Perl se usar com a opção específicagrep
do GNU .grep
-P
Observe também que
grep
retorna linhas por padrão, não substrings de linhas. Novamente, com GNUgrep
(e algumas outrasgrep
implementações), você pode usar a-o
opção de obter apenas o(s) bit(s) que corresponde à expressão fornecida de cada linha.Observe que ambos
-P
e-o
são extensões não padrão da especificação POSIX degrep
.Se você não estiver usando GNU
grep
, poderá usarsed
para obter o bit entre a stringprefix
e o final da linha:O que isso faz é imprimir apenas as linhas que
sed
conseguem aplicar a substituição fornecida. A substituição substituirá a linha inteira que corresponde à expressão (que é um BRE), pela parte dela que ocorre após a stringprefix
.Observe que, se houver várias instâncias de
prefix
em uma linha, ased
variação retornará a string após a última , enquanto a variação GNUgrep
retornará a string após a primeira (que inclui as outras instâncias deprefix
).A
sed
solução seria portátil para todos os sistemas do tipo Unix.Como as outras respostas afirmaram,
grep
não usa um sabor de regex com lookbehinds (por padrão com GNUgrep
, ou não com outras versões).Se você não conseguir usar GNU
grep
oupcregrep
, você pode usarperl
se tiver.A linha de comando equivalente a
perl
seria:Você coloca o regex desejado entre as barras. Como você está usando Perl, isso usa o sabor regex do Perl .