Usando grep para filtrar pastas com números

Usando grep para filtrar pastas com números

Eu estava tentando listar apenas pastas com números filtrando umls -1(a opção -1élistar um arquivo por linha) através do grep (eu sei que o find também pode fazer isso, mas por causa deste exemplo, quero me limitar ao grep)

As pastas são

PC:test user$ ls -1
1184
36
69929
7
9907

Agora é isso que recebo com as diferentes saídas ...

Este: não entendo por que 9907 está lá, pois de alguma forma fazia sentido que apenas a pasta 7 de um dígito estivesse?

PC:test user$ ls -1 | grep [0-9]
7
9907

Está faltando 7. A .média é 2 ou mais?

PC:test user$ ls -1 | grep [0-9].
1184
36
69929
9907

Isso significa combinar tudo com um número ali?

PC:test user$ ls -1 | grep [0-9].*
1184
36
69929
7
9907

Quando entre aspas, funciona como eu esperava, então por quê? É equivalente a [0-9].*?

PC:test user$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907

Responder1

"substituição de nome de arquivo" ou "expansão de nome de caminho" ou "globbing"

Quando você digita um comando, ele é submetido a vários estágios de transformação potencialantesqualquer programa (como grep) é invocado.

[é um caractere especial em alguns shells.

$ echo [0-9]
7

O que acho que está acontecendo aqui é que o shell está expandindo 0-9 como uma seleção de nome de arquivo e encontrando seu arquivo "7" e, portanto, passando "7" para grep. Portanto, o grep está procurando nomes de arquivos que contenham um "7" em qualquer lugar do nome do arquivo.

Se você deseja [ser processado pelo grep e não pelo shell, você deve citar a string ou enganar o shell para que analise a expressão de maneira diferente.

$ echo [0-9].
[0-9].

Citar é recomendado.

Veja também man bash (procure for) man teste página 151 deesse


expressões regulares

Em uma expressão regular, .significa “qualquer caractere único”. Então [0-9].significa qualquer dígito seguido por um único caractere. O nome do arquivo 7não possui o último.


Se você deseja que o grep encontre nomes de arquivos de um único dígito, você precisa ancorar sua expressão no início e no final da linha

$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907

$ ls -1 | grep '^[0-9]$'
7

Ops, destruí meu computador

O uso descuidado de caracteres especiais leva a todos os tipos de resultados interessantes

$ ls -1 > x
$ grep *
x:1184

Isso deve ficar mais claro se você considerar

$ ls -1
1184
36
69929
7
9907
x

$ echo *
1184 36 69929 7 9907 x

Agora basta adicionar rme sudoà mistura e você poderá ter uma experiência que pode mudar drasticamente sua carreira.

informação relacionada