Existe uma maneira de criar "palavras" de saída grep de arquivos que correspondem à expressão de pesquisa?
Se eu quiser encontrar todas as instâncias de, digamos, "th" em vários arquivos, eu posso fazer:
grep "th" *
mas a saída será algo como (negrito é por mim);
some-text-file: o gato sentou-se no tapete algum outro arquivo de texto: a raposa marrom rápida contudo-outra-text-file: eu espero que isso explica minuciosamente
O que eu quero que ele produza, usando a mesma pesquisa, é:
the
the
the
this
thoroughly
Isso é possível usando grep? Ou usando outra combinação de ferramentas?
Respostas:
Tente grep -o
Editar: correspondência do comentário de Phil
Dos documentos :
fonte
"\w*th\w*" *
significa, então achei que iria postar.\w
é [_ [: alnum:]], então isso corresponde basicamente a qualquer "palavra" que contenha 'th' (já\w
que não inclui espaço). O * após a seção citada é uma bola para o qual os arquivos (ou seja, combinando todos os arquivos neste diretório)\w
geralmente não é portátil paragrep -E
; para portabilidade adequada, use o nome da classe de caracteres POSIX[[:alnum:]]
(ou[_[:alnum:]]
se você realmente deseja o sublinhado também; ou tentegrep -P
se sua plataforma possui esse).-h
é totalmente necessário, eu diria ..?Resposta segura de distribuição cruzada (incluindo windows minGW?)
Se você estiver usando versões mais antigas do grep (como 2.4.2), que não inclui a opção -o. Use o acima. Caso contrário, use o mais simples para manter a versão abaixo.
Resposta segura para distribuição cruzada do Linux
Para resumos,
-oh
a expressão regular corresponde ao conteúdo do arquivo (e não ao nome do arquivo), exatamente como você esperaria que a expressão regular funcionasse no vim / etc ... Qual palavra ou expressão regular você procuraria então, depende de você! Enquanto você permanecer no POSIX e não na sintaxe perl (consulte abaixo)Mais do manual para grep
A razão pela qual a resposta original não funciona para todos
O uso de
\w
varia de plataforma para plataforma, pois é uma sintaxe "perl" estendida. Como tal, a instalação grep limitada a trabalhar com classes de caracteres POSIX usa[[:alpha:]]
e não seu equivalente em perl\w
. Veja a página da Wikipedia sobre expressões regulares para maisPor fim, a resposta POSIX acima será muito mais confiável, independentemente da plataforma (sendo a original) para grep
Quanto ao suporte à opção grep sem -o, o primeiro grep gera as linhas relevantes, o tr divide os espaços em novas linhas, o grep final filtra apenas as respectivas linhas.
(PS: Eu sei que a maioria das plataformas até agora teria sido corrigida por \ w .... mas sempre há aquelas que ficam para trás)
Crédito pela solução alternativa "-o" da resposta @AdamRosenfield
fonte
-o
opção não está presente nas janelas grep que é instalada com o pacote git (MinGW?):"c:\Program Files (x86)\Git\bin\grep" --version grep (GNU grep) 2.4.2
É mais simples do que você pensa. Tente o seguinte:
Onde,
fonte
Você pode converter espaços em novas linhas e depois grep, por exemplo:
fonte
tr
, ele poderia fazergrep
primeiro, entãotr
seria aplicado apenas às linhas correspondentes:grep th filename | tr ' ' '\n' | grep th
Apenas
awk
, não há necessidade de combinação de ferramentas.fonte
comando grep apenas para correspondência e perl
fonte
th
porque você solicitou a menor repetição possível do curinga.Eu estava insatisfeito com a sintaxe difícil de lembrar do awk, mas gostei da ideia de usar um utilitário para fazer isso.
Parece que o ack (ou o ack-grep, se você usa o Ubuntu) pode fazer isso facilmente:
Se você omitir o sinalizador -h, obtém:
Como bônus, você pode usar o
--output
sinalizador para fazer isso em pesquisas mais complexas com a sintaxe mais fácil que encontrei:fonte
fonte
cat
?Para pesquisar todas as palavras com start com "icon-", o comando a seguir funciona perfeitamente. Estou usando o Ack aqui, que é semelhante ao grep, mas com melhores opções e boa formatação.
fonte
Você também pode tentar o pcregrep . Há também uma
-w
opção no grep , mas em alguns casos não funciona como o esperado.Da Wikipedia :
fonte
Eu tive um problema semelhante, procurando por regex grep / pattern e o "padrão correspondente encontrado" como saída.
No final, usei o egrep (o mesmo regex no grep -e ou -G não me deu o mesmo resultado do egrep) com a opção -o
então, eu acho que poderia ser algo semelhante a (eu não sou um mestre de regex):
fonte
{1}
quantificadores inúteis devem ser descartados. Ou se você quiser ser consistente,t{1}h{1}e{1}
etc. #Você pode canalizar sua saída grep para Perl assim:
fonte
Trecho da página do manual grep:
-w: selecione apenas as linhas que contêm correspondências que formam palavras inteiras. O teste é que a substring correspondente deve estar no início da linha ou precedida por um caractere que não seja de palavra.
fonte
the
não corresponda mais, por exemplo, "estes" ou "banhar".ripgrep
Aqui está o exemplo usando
ripgrep
:Combina todas as palavras correspondentes
th
.fonte