it-swarm-pt.tech

Can GNU Grep envia um grupo selecionado?

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

Exemplo:

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

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

46
Torandi

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

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

Ou, sem a opção -E:

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

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

sed -n "s/.*'\([^']\+\)'.*/\1/p"
49
jtbandes

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

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

28
Aldrik

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

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

Apenas grep do GNU.

2
drewk