Eu quero grep os arquivos cujo nome não contém"^iX500"
$ cat note_list
...
/Applications/ScanSnap Manual.localized/iX500ScanSnapManual.app/Contents/Resources/manual/basic/EN/ix500/images_mac/EvernoteMark.png
/Applications/ScanSnap
eu tentei
cat note_list | grep -i "^iX500"
#not return results
e
$ cat note_list | egrep -i "^(iX500)"
#not return result
Finalmente, eu uso o -v
get it done
cat note_list | egrep -i -v "(iX500)"
mas como eu poderia usar negate ^
em grep.
O problema com o uso
grep
de nomes de arquivos é quegrep
é uma ferramenta orientada a linhas e nomes de arquivos podem conter novas linhas.Supondo que todos os nomes de arquivo em seu arquivo não tenham novas linhas, você usaria
grep -v
para negar o sentido de correspondência:Eu adicionei
-F
uma vez que é uma string em vez de uma expressão regular com a qual estamos correspondendo.O
^
é usado dentro[...]
para corresponder a um único caractere que não está em um conjunto específico. Por exemplo,[^a-z]
corresponderia a um único caractere que não seja uma letra minúscula no intervalo fornecido (assumindo a localidade POSIX padrão). Quando usado em outro lugar,^
denota o início da string, de modo que, por exemplo,^alpha
corresponde à stringalpha
apenas no início de uma linha (e da mesma forma,alpha$
corresponde à string apenas no final da linha).O que eu acho que você está procurando é criar uma expressão regular que corresponda a "não
iX500
". O problema com isso é que a maioria das strings em seu exemplo corresponderia a isso. Por exemplo, o bit que éApplications
(em ambas as linhas do exemplo) é "notiX500
".O seguinte extrai todas as linhas que não contêm a letra
X
:X
Em vez da expressão " not "[^X]*
, no seu caso, você teria que criar uma expressão regular que corresponda à linha inteira, mas que não corresponda à palavraiX500
em nenhum lugar.Provavelmente é possível de alguma forma com o GNU
grep
e usando uma expressão PCRE com look-ahead/behind, mas é muito mais fácil apenas combinariX500
e depois negar o sentido da correspondência com-v
.