sh e números grep apenas

2

Estou enfrentando um problema e tentando encontrar uma solução que funcione em sh . Se eu pudesse usar o bash, este código funcionaria:

ls /a|grep ^[0-9]

Infelizmente este não é o caso de sh, e sim eu preciso usar sh. :) Correndo em sh eu recebo

ls /a |grep ^[0-9]
[0-9]: not found
Usage: grep -hblcnsviw pattern file . . .

Se eu remover o ^ o código funciona, mas preciso apenas dos arquivos que começam com números e não dos que contêm números. Exemplo, eu preciso dos arquivos que são como:

12.00.2
2.222.1234.12

da página do manual do grep, eu deveria poder usar ^ .

Por enquanto, minha implementação foi feita usando:

ls /a|grep -v [a-z]|grep -v [A-Z]

Como isso irá remover todos os arquivos que contenham caracteres, mas ainda assim, se um arquivo for .123.33, ele será exibido.

    
por BitsOfNix 05.06.2013 / 14:45

4 respostas

3

Algo como isso deve funcionar para você:

ls /a | egrep "^[0-9]"

Por @Anthons o feedback egrep está obsoleto, por isso você pode usar -E como uma mudança para o comando normal grep :

ls /a | grep -E "^[0-9]"

Per @ O feedback de Stephane as expressões regulares estendidas (ERE) nem são necessárias nesta situação. Realmente, o que importa é a citação do ^[0-9] para protegê-lo de ser interpretado por qualquer versão de /bin/sh que você esteja usando e que tenha o problema. Então, algo assim seria a correção mais simples para o seu problema:

ls /a | grep "^[0-9]"

-ou -

ls /a | grep '^[0-9]'
    
por 05.06.2013 / 14:51
3

Por sh , acho que você está se referindo ao shell Bourne, que era o shell da maioria dos sistemas Unix antes de meados dos anos 90 e era /bin/sh no Solaris antes do Solaris 11.

No Solaris 10 e versões anteriores, não use /bin/sh . Essa casca é de outra época. Use /usr/xpg4/bin/sh em vez disso.

No shell Bourne ^ é um alias para | para compatibilidade com seu antecessor, o shell Thompson. Então seu comando é como:

ls /a|grep |[0-9]

E o shell Bourne relata que não pode encontrar um comando chamado [0-9] e grep reclama por não ter recebido nenhum argumento.

Mesmo se estiver usando um sh padrão em oposição ao shell Bourne, recomendamos que você cite ^ . Por exemplo, ^ é um operador globbing em zsh quando a opção extendedglob está ativada.

Em qualquer caso, se não for ^ , você deve citar [0-9] , já que são operadores globbing. [0-9] seria expandido pelo shell para a lista de arquivos no diretório atual cujo nome é um único dígito.

Então:

ls /a | grep '^[0-9]'

Aliás, no shell Bourne

ls /a ^ grep '^[0-9]'

também funcionaria.

    
por 05.06.2013 / 15:36
2

Você não precisa de ls e grep para isso; você pode usar um glob /a/[0-9]* :

simples
echo /a/[0-9]*
ls /a/[0-9]*
grep foo /a/[0-9]*

Se você estiver usando isso em um script, cuidado para analisar a saída ls como uma má idéia .

    
por 05.06.2013 / 15:11
1

Eu concordo com l0b0 grep é uma idéia ruim aqui, mas de qualquer forma, aqui está uma explicação do problema e uma solução alternativa. No Solaris 10 e versões anteriores, /bin/sh é um shell antiquado que não deve ser usado para nada além de executar scripts legados. Você realmente deve usar ksh , bash ou /usr/xpg4/bin/sh .

A causa raiz aqui é que ^ costumava ser a maneira original de especificar um pipe nos tempos iniciais do Unix. O Solaris /bin/sh herdou esse recurso arqueológico.

A solução alternativa é bastante simples, apenas escape do cursor de uma destas maneiras:

ls /a |grep \^[0-9]

ou

ls /a |grep "^[0-9]"

ou

ls /a |grep '^[0-9]'
    
por 05.06.2013 / 15:36