Quando executo ls /directory | grep '[^term]'
no Bash, recebo uma listagem regular, como se o grep
comando fosse ignorado de alguma forma. Tentei a mesma coisa egrep
, tentei usá-lo com aspas duplas e simples, mas sem resultados melhores. Quando tento ls /directory | grep '^[term]
, recebo todas as entradas que começam com term - como esperado.
Eu tentei esse comando em um editor online, onde posso testar meu regex e ele funcionou como deveria. Mas não no Bash. Por isso, funciona em uma simulação, mas não na vida real.
Eu trabalho no Crunchbang Linux 10. Espero que sejam informações suficientes e estou ansioso por todas as dicas, porque não executar em um nível tão básico e perder horas de tempo é realmente frustrante!
grep
linhas começando com term. Ou você deseja grep para linhas que não contêm termo?Respostas:
Tem certeza de que o que você quer está acontecendo? Quando você executa,
ls /directory | grep '[^term]'
você está essencialmente esperando por não as letras ter m. Isso significa que se um arquivo tiver outras letras em seu nome, ele ainda aparecerá na saída dels
. Tome o seguinte diretório, por exemplo:Agora, se eu executar
ls |grep '^[brav]'
, recebo o seguinte:Como você pode ver, não só recebi
brave
comobravo
tambémalpha
porque a classe de personagem[]
receberá qualquer letra dessa lista.Conseqüentemente, se eu executar
ls |grep '[^brav]'
, vou obter todos os arquivos que não contêm os caracteres brav em qualquer lugar do nome.Se você notar, ela incluiu toda a lista de diretórios porque todos os arquivos tinham pelo menos uma letra que não foi incluída na classe de caracteres.
Então, como Kanvuanza disse, para grep pelo inverso de "termo", em oposição aos caracteres,
t e r m
você deve fazê-lo usandogrep -v
.Por exemplo:
Além disso, se você não quiser usar os arquivos que possuem caracteres na classe
grep -v '[term]'
. Isso impedirá a exibição de arquivos com esses caracteres. (Resposta de Kanvuanza)Por exemplo:
Como você pode ver, não havia arquivos listados porque todos os arquivos desse diretório incluíam pelo menos uma letra dessa classe.
Termo aditivo:
Eu queria acrescentar que, usando o PCRE, é possível usar apenas regex para filtrar usando expressões negadas. Para fazer isso você usaria algo conhecido como um negativo regex olhar em frente:
(?!<regex>)
.Portanto, usando o exemplo acima, você pode fazer algo assim para obter os resultados desejados sem usar
grep
sinalizadores.Para desconstruir esse regex, ele primeiro corresponde no início de uma linha
^
e, em seguida, procura por seqüências que não correspondembrav
a seguir. Apenasalpha
,charlie
edelta
jogo assim que aqueles são os únicos que são impressos.fonte
-v
opção. Obrigado por seu apoio! Esta pergunta realmente arruinou minha tarde, onde sua resposta ilumina minha noite!negative look-ahead regex
.Eu acho que a
grep -v
bandeira faz o que você quer. Na página do manual :Você pode usar
ls /directory | grep -v [term]
para imprimir linhas não correspondentes.fonte
[^abc]
mas tenho certeza de que o grep não suporta negações de classe, exceto algumas padrão (por exemplo[[:^digits:]]
).) O suporte do grep para negação é horrível !grep
o manuseio de classes de caracteres é ótimo. Significa apenas algo bem diferente do que você (entende) mal.[abc]
significa uma dasa
,b
, ouc
;[^abc]
significa qualquer coisa, exceto o acima. É um personagem.