O GNU Grep pode gerar um grupo selecionado?

42

É possível usar o GNU grep para obter um grupo correspondente de uma expressão?

Exemplo:

echo "foo 'bar'" | grep -oE "'([^']+)'"

Qual seria a saída "'bar'". Mas eu gostaria de obter apenas "bar", sem ter que enviá-lo através do grep mais uma vez (ou seja, obter o grupo correspondente). Isso é possível?

    
por Torandi 23.07.2009 / 01:26

3 respostas

46

Você pode usar sed para isso. No BSD sed :

echo "foo 'bar'" | sed -E "s/.*'([^']+)'.*/\1/"

Ou, sem a opção -E :

sed "s/.*'\([^']\+\)'.*//"

Isso não funciona para entrada de múltiplas linhas. Para isso você precisa:

sed -n "s/.*'\([^']\+\)'.*//p"
    
por 23.07.2009 / 01:30
26

Enquanto o grep não pode produzir um grupo específico, você pode usar lookahead e behind assertions para obter o que deseja depois:

echo "foo 'bar'" | grep -Po "(?<=')[^']+(?=')"

    
por 11.01.2012 / 00:33
2

Você pode usar \K para redefinir e descartar o texto de correspondência da mão esquerda junto com uma lookahead que não é adicionada ao texto de correspondência:

$ echo "foo 'bar'" | grep -oP "'\K[^']+(?=')"
bar

Apenas grep do GNU.

    
por 27.02.2017 / 19:15

Tags