Por que o comando grep ignora o período na string de pesquisa?

2

O comando que estou usando:

find . -type f -name "*.sql" -exec grep -i -l 'schema_name.' {} +

O que eu quero pesquisar são todos os arquivos que contêm schema_name. . Mas o comando find está ignorando o último . e está procurando apenas schema_name em vez de schema_name.

    
por romil gaurav 07.04.2016 / 12:28

4 respostas

12

Isso é grep issue, não find .

grep corresponde ao padrão usando a expressão regular por padrão, o padrão schema_name. significa que qualquer caractere segue a string schema_name .

Se você quer combinar o ponto . literalmente, você tem que escapar com uma barra invertida \ :

find . -type f -name "*.sql" -exec grep -il 'schema_name\.' {} +

ou usando -F option:

find . -type f -name "*.sql" -exec grep -Fil 'schema_name.' {} +
    
por 07.04.2016 / 12:33
4

Você poderia usar o fgrep

find . -type f -name "*.sql" -exec fgrep -i -l 'schema_name.' {} +

que em sistemas operacionais Unix mais antigos pode muito bem ser muito mais rápido (fgrep, grep e egrep costumavam ser 3 executáveis diferentes, e o fgrep era muito mais rápido porque omitia tudo relacionado a regex - eg por exemplo sistemas baseados em GNU esses três programas são apenas links para o mesmo executável).

    
por 07.04.2016 / 16:32
2

Escape o ponto no padrão de pesquisa grep :

find . -type f -name "*.sql" -exec grep -i -l 'schema_name\.' {} +
    
por 07.04.2016 / 12:32
1

Why does the grep command ignore the period in the search string?

Isso não acontece.

Para provar, corra

grep . file

que é uma maneira fácil de remover todas as linhas vazias de file .

Em outras palavras, . é o átomo de expressão regular de qualquer caractere único (exceto a nova linha). Para corresponder literalmente a um ponto, o átomo deve ser salvo como \.

    
por 07.04.2016 / 22:42