Eu tenho este regex:
(?<=prefix).*$
que retorna qualquer caractere após a sequência "prefix" e funciona bem em qualquer mecanismo de regex online (por exemplo, https://regex101.com ). O problema é quando eu uso esse regex no bash:
grep '(?<=prefix).*$' <<< prefixSTRING
não corresponde a nada. Por que esse regex não funciona com grep?
grep
regular-expression
mark009
fonte
fonte
.*$
corresponde a qualquer sequência até o final da linha (ou final da sequência), não apenas um caractere.Respostas:
Você parece ter definido o regex certo, mas não definiu os sinalizadores suficientes na linha de comando
grep
para entendê-lo. Porque, por padrão,grep
suporta BRE e com-E
flag, ERE. O que você tem (olhar para o futuro) está disponível apenas no sabor regex PCRE, que é suportado apenas no GNUgrep
com seu-P
sinalizador.Supondo que você precise extrair apenas a sequência 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 fazerExplicações detalhadas sobre vários tipos de expressões regulares são explicadas nesta maravilhosa resposta e ferramentas de Giles que implementam cada uma delas
fonte
Expressões regulares vêm em muitos sabores diferentes. O que você está mostrando é uma expressão regular do tipo Perl (PCRE, "Expressão regular compatível com Perl").
grep
faz expressões regulares POSIX. Essas são expressões regulares básicas (BRE) e expressões regulares estendidas (ERE, segrep
usadas com a-E
opção). Consulte o manual parare_format
ouregex
ou qualquer outra coisa semelhante manual do seugrep
manual refere-se em seu sistema, ou os textos padrão POSIX que eu só vinculados.Se você usa o GNU
grep
, seria capaz de usar expressões regulares do tipo Perl se usassegrep
com a opçãogrep
específica do GNU-P
.Observe também que
grep
retorna linhas por padrão, não substrings de linhas. Novamente, com o GNUgrep
(e algumas outrasgrep
implementações), você pode usar a-o
opção para obter apenas os bits que correspondem à expressão especificada de cada linha.Observe que as extensões
-P
e-o
não-padrão são a especificação POSIX degrep
.Se você não estiver usando o 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 corresponder à expressão (que é um BRE), pela parte que ocorrer após a sequênciaprefix
.Observe que, se houver várias instâncias de
prefix
uma linha, ased
variação retornará a sequência após a última , enquanto agrep
variação GNU retornará a sequência após a primeira (que incluiria as outras instâncias deprefix
).A
sed
solução seria portátil para todos os sistemas do tipo Unix.fonte
Como as outras respostas declararam,
grep
não usa um sabor de expressão regular com lookbehinds (por padrão no GNUgrep
, ou de modo algum com outras versões).Se você não conseguir usar o GNU
grep
oupcregrep
, poderá usá-perl
lo, se o tiver.A linha de comando equivalente a
perl
seria:Você coloca a regex desejada entre as barras. Como você está usando Perl, isso usa o sabor regex do Perl .
fonte
print "$&\n" if ...
se eles querem a saída apenas a parte após oprefix