Asterisco não funciona com grep

4

Eu pesquisei ki com * conforme o exemplo abaixo e deveria ter retornado as três primeiras linhas. Não sei por que ele retorna a última linha quando não há ki correspondente.

$ grep "ki*" trial_file.txt
kartik,27,Bangalore,Karnataka
pulkit,25,Bangalore,Karnataka
kit,28,Bangalore,Karnataka
kush,24,Pennsylvania,Philadelphia
    
por Aakanksha Chaturvedi 18.09.2017 / 20:28

2 respostas

11

Não use * para isso. Use grep 'ki' trial_file.txt ou grep -F 'ki' trial_file.txt .

  1. A menos que você passe a opção -x / --line-regex , grep retornará linhas que contêm uma correspondência em qualquer lugar, mesmo que a linha inteira não seja compatível. Então tudo que você precisa fazer é combinar parte da linha. Você não precisa fazer nada especial para indicar que pode haver mais caracteres.

  2. Em uma expressão regular , * significa "zero ou mais do item anterior". Isso é totalmente diferente do significado em expansão do nome do caminho (veja também este artigo , man 7 glob e < href="https://www.gnu.org/software/bash/manual/bash.html#Filename-Expansion"> esta seção ). Então, por exemplo:

    • ax*b corresponde a a , seguido por qualquer número de x es (até nenhum), seguido por b : ab , axb , axxb , axxxb , ...
    • a[xz]*b corresponde a seguido por qualquer número de caracteres em que cada um é x ou z , seguido por b : ab , axb , azb , axxb , axzb , azxb , azzb , axxxb , ...
    • a(xyz)*b corresponde a a , seguido a zero ou mais ocorrências da sequência xyz , seguido por b : ab , axyzb , axyzxyzb , axyzxyzxyzb , ...

Neste caso, parece que você está apenas procurando por texto. Você não precisa usar expressões regulares metacaracteres como . , * ou \ que têm significados especiais. É por isso que sugiro passar o -F flag, que faz com que grep pesquise por "strings fixas" em vez de executar a correspondência de expressões regulares.

Se, no entanto, você quiser corresponder apenas começando no início da linha, use um metacaractere de expressão regular: ^ , como mjb2kmn sugere . Estas âncoras correspondem ao início da linha. Nesse caso, você executaria grep '^ki' trial_file.txt .

Para mais informações sobre as opções que o grep suporta, consulte man grep e o manual do GNU Grep .

Embora, em geral, sugiro incluir expressões regulares em ' ' quotes , neste caso sem aspas é necessário porque o shell não executa nenhum expansões em ki ou ^ki antes de passá-las para grep .

    
por Eliah Kagan 18.09.2017 / 20:46
10

Acho que você está esperando curingas no estilo shell aqui, mas o que você está obtendo é uma expressão regular. Ao pesquisar por ki* , você está pedindo literal k seguido por 0 ou mais i s.

A primeira linha também não contém "ki".

Como fazer isso corretamente depende do que exatamente você está tentando corresponder.

Como comentado acima, grep "ki" poderia ser o que você quer, ou se você quer combinar apenas linhas começando com "ki" você precisaria de grep "^ki" .
^ denota o começo da linha. / p>     

por mjb2kmn 18.09.2017 / 20:33