O grep mudou como ele usa o regexp?

3

Eu costumava executar comandos como: find / dev | grep sd * para exibir uma lista de todas as unidades conectadas ao meu computador. Parece que agora preciso adicionar qualquer caractere aleatório antes da estrela para obter o mesmo efeito, conforme mostrado abaixo:

Eu testei isso em vários servidores Ubuntu 12.04 e obtive o mesmo efeito, então eu não acho que isso é apenas algo aleatório no meu desktop. Esta é uma nova mudança, um bug, ou sempre foi assim e minha memória precisa ser substituída?

    
por Programster 20.11.2013 / 13:08

1 resposta

5

Você tem dois problemas:

  • Globbing interfere no seu regexp
  • Seu regexp não corresponde ao que deve corresponder

Descobrindo o mecanismo de globbing

sudo find /dev | grep sd* não funciona como antes porque você tem um arquivo ou uma pasta em seu diretório de trabalho atual que aciona o globbing do bash. Adicione um echo na frente do seu comando para ver o que o globbing faz ao seu comando

echo grep sd*

Ao adicionar um caractere adicional aleatório, o globbing não corresponde mais ao arquivo / pasta e o grep continua a funcionar como esperado.

Como evitar globbing

Para evitar que o globbing seja ativado, você precisa colocar '...' em seu período. (Aspas duplas funcionarão também.) Isso fará com que o grep se comporte como antes:

sudo find /dev | grep 'sd*'

Como funcionam as expressões regulares

Agora que o regexp está funcionando como esperado, vamos ver o que * significa em expressões regulares em oposição a globalização de arquivos. Em suma, significa "Este último caractere zero ou n vezes" e isso provavelmente não é o que você deseja. Usando 'sd*' , você pode ver /dev/stdout na saída, pois stdout começa com s seguido por zero ou mais d 's.

No seu caso, um simples:

sudo find /dev | grep sd

deve ser tudo que você precisa para corresponder.

Ou, é claro, você pode simplesmente executar um dos seguintes comandos (que usam padrões de glob de arquivos, não expressões regulares) para fornecer a mesma saída:

find /dev -name 'sd*'
ls -1 /dev/sd*
    
por MadMike 20.11.2013 / 13:22

Tags