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?


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.


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.


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.