[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] Grep com asterisco não mostra o que eu quero
From: |
Felipe Kellermann |
Subject: |
Re: [shell-script] Grep com asterisco não mostra o que eu quero |
Date: |
Wed, 1 Mar 2006 11:39:55 -0300 (BRT) |
User-agent: |
Pine <http://www.washington.edu/pine/> |
On Wed, 1 Mar 2006 11:38am -0300, Eriberto wrote:
> lua:~# ls
> mala mela taco testa teste todos
>
> lua:~# ls | grep te
> testa teste
>
> lua:~# ls | grep te*
>
> O último comanado não mostrou nada. Ele não deveria interpretar como o
> "e", aparecendo de 0 a n vezes, e mostrar "taco testa teste todos"???
O que está acontecendo é que o shell vai expandir (globbing) esse teu te*.
O `ls' faz um teste para ver se ele está enviando os resultados para um
terminal ou não. Se não está, ele faz algumas modificações no compotamento
dele por opções implícitas (por exemplo, umas das opções implícitas
adicionadas é -1). Exemplo:
$ ls
mala mela taco testa teste todos
$ ls | cat -n
1 mala
2 mela
3 taco
4 testa
5 teste
6 todos
O teu te* vai expandir para "testa teste":
$ echo te*
testa teste
E, portanto, teu comando final é este, substituindo o glob (te*):
ls | grep testa teste
Não tem nenhum arquivo com o nome "testa teste", e por isso não mostra
nada. A minha única curiosidade é entender o motivo de tu precisar estar
usando grep para procurar os arquivos. Em geral é interessante, melhor e
mais limpo usar só glob. Quanto mais flexível é o globbing do shell, mais
interessante, útil e poderoso é o ambiente.
Por exemplo:
$ arquivos=(te*)
Ou
$ for in te*; { ... }
OBS: E a interpretação não é de "`e' zero ou mais". Há diferenças entre
expressões regulares e globbing. Em um glob o teu "te*" significa apenas o
literal "te" seguido de qualquer coisa.
--
Felipe Kellermann