grep * .c não funciona

0

Eu tenho uma lista de ".c" (arquivos c) no diretório atual.

Eu tenho que encontrar todos os arquivos .c no diretório atual.

O comando que pode ser usado id ls * .c

Mas, outra maneira é usar o grep.

então se eu der

 ls | grep *.c

Ele não retorna nenhum resultado para este comando, enquanto para outros tipos de arquivo como ".java", ".txt" ele fornece os resultados esperados.

Existe algum significado especial para "* .c" no comando grep? Ou posso saber o motivo desse comportamento?

    
por vivek_nk 16.01.2013 / 18:40

6 respostas

7

*.c é um padrão glob, enquanto grep procura por expressões regulares.

Você deseja que ls | grep '\.c$' encontre todos os arquivos que terminam em .c .

grep corresponde a qualquer substring por padrão, não a string inteira, portanto, não é necessário escrever algo que corresponda ao início do nome do arquivo. Se você quisesse escrever isso, seria .* em uma expressão regular. . indica "qualquer caractere, exceto para uma linha que termina", e * indica "qualquer número (zero ou mais) da expressão anterior".

Como . tem um significado especial em uma expressão regular, se você quiser corresponder a um literal . , será necessário escapar com \ . Como \ tem um significado especial no shell, é necessário citar a expressão regular com aspas simples ( ' ).

Para garantir que você corresponda apenas no final do nome do arquivo, use $ , que corresponde ao final da linha.

    
por 16.01.2013 / 18:43
3

Ou use o recurso "Localizar" e, em seguida, obtenha uma listagem, se necessário, por exemplo,

find . -name "*.c" -exec ls -al {} \;

Encontrar é muito útil.

    
por 16.01.2013 / 18:48
0

O grep está pesquisando o conteúdo dos arquivos do seu REGEX e não os nomes dos arquivos.

    
por 16.01.2013 / 18:42
0

Por favor, tente:

ls | grep '\.c$'

O RegExp "*" não é necessário

    
por 16.01.2013 / 18:46
0

grep "* .c" vai procurar LITERALMENTE pela string "* .c", ou seja, string "asterisco dot c" sem expandi-lo para significar "todos os arquivos com extensão .c", e é por isso que não está encontrando nada na saída de "ls":

# touch b.c

# ls -1 | grep "* .c"

o resultado está vazio.

Se você quer expansão, você deve usar egrep (grep estendido) que faz expressões regulares. Mas aqui eles são um pouco diferentes:

# ls -1 | egrep ".*.c"
b.c

isto é, regex é:. *. c (qualquer caracter não-nova linha multiplicada zero ou mais vezes, qualquer caractere não pertencente a nova linha [você pode dizer que ele significa literalmente "ponto"], "c")

    
por 16.01.2013 / 19:06
0

Você precisa citar asteriscos:

ls | grep "*.c"

ou o shell bash vai expandi-lo e executar algo como:

ls | grep 1.c 2.c 3.c

(supondo que você tenha arquivos chamados 1.c , 2.c , 3.c no diretório atual).

que não vai dar o resultado esperado.

O que realmente faremos é pesquisar o conteúdo de 2.c e 3.c e mostrar as linhas que têm a string 1.c , que provavelmente não são nenhuma, e é por isso que você obtém uma saída vazia.

(Só estou explicando por que você conseguiu uma saída vazia, como os outros disseram, *.c também não é um regex válido)

    
por 16.01.2013 / 18:52