Linhas grep começando com "1" no Ubuntu

47

Eu tento procurar por linhas que começam com "1" usando

ls -1 | grep ^1*

mas retorna linhas que não começam com 1. O que estou perdendo aqui?

Tim
fonte
Apenas outra observação: se você quiser usar o grep para limitar a lssaída, terá problemas se os nomes de arquivos contiverem caracteres estranhos, como novas linhas ... Muitos outros comandos (de alguma forma ls, pelo menos não a versão que eu tenho que verificar) tem uma opção para fornecer saída separada nula, com a qual você pode processar com segurançagrep -z
Gert van den Berg
Obrigado, @GertvandenBerg! Quais problemas alguns caracteres estranhos, como novas linhas, podem causar ao grep? Quais comandos fornecem saída separada nula?
Tim
1
Se encontrar com -print0, a maioria das outras ferramentas GNU tem uma opção -0 ou -z. (tipo, xargs, etc.). Se os nomes de arquivos contiverem novas linhas, seria impossível saber se duas linhas são um nome de arquivo que contém uma nova linha ou dois nomes de arquivos separados.
Gert van den Berg

Respostas:

68

Sua expressão regular não significa o que você pensa que faz. Corresponde a todas as linhas que começam (^) com um (1) zero repetido ou mais (*) vezes. Todas as cadeias correspondem a essa expressão regular. grep '^1'faz o que você quer.

otokan
fonte
33

Você tentou o seguinte?

 ls -1 | grep "^1"

Ou seja, remova o *, que basicamente diz grep, encontre zero ou mais ocorrências da ^1expressão. Em outras palavras: combine as linhas que começam com 1 ou não.

Bernhard
fonte
13

Embora isso não responda à sua pergunta, esta é uma solução melhor para o que parece ser seu objetivo:

ls -ld 1*

Você pode usar um shell glob para listar todos os arquivos que começam com 1. Observe que *tem um significado diferente no globbing do shell do que nas expressões regulares.

jordanm
fonte
Obrigado! +1. Como * tem um significado diferente no globbing do shell e nas expressões regulares?
Tim
2
Em um shell glob * é um curinga que significa "0 ou mais de qualquer caractere". O significado de regex é explicado na resposta de otokan.
Jordanm 31/12
3

^ 1. * corresponde à linha inteira, ou exatamente como dito acima, ^ 1 obteve a string contida na linha.

estilos diferentes de regex usam símbolos diferentes que representam caracteres, algumas opções especificam qual estilo você deseja. e opções diferentes especificam se você deseja corresponder a linha inteira, ou apenas parte dela, ou toda a entrada como uma sequência.

Shellukolle
fonte