grep diz 'intervalo de caracteres inválido'

grep diz 'intervalo de caracteres inválido'

Então, estou usando uma combinação de finde greppara filtrar uma lista de nomes de arquivos de um documento de texto simples.

Aqui está o comando que executo:

find /Volumes/Documents\ -\ Part\ 1/July 2009 -type f | grep -vf files.txt

Em arquivos.txt eu tenho isso:

/Volumes/Documents - Part 1/July 2009/vacation.pdf
/Volumes/Documents - Part 1/July 2009/pie time!.jpg
/Volumes/Documents - Part 1/July 2009/Coding/Unix/sample.sh
/Volumes/Documents - Part 1/July 2009/trip-to-spain.pages

Quero que ele produza quaisquer linhas não correspondentes, mas em vez disso recebo o seguinte:

grep: invalid character range

Qual é a causa disso? Há muito mais em files.txt, apenas omiti porque seria muito longo. Eu também tenho vários caracteres Unicode. Isso poderia estar causando algum problema?

Mac OS X Yosemite, bash 3.2.57(1)-release, grep (BSD grep) 2.5.1-FreeBSD

Responder1

TLDR; adicionar-F


A -fopção grep é usada para se referir a um arquivo que contém uma lista depadrões- seu arquivo não contém uma lista de padrões, contém uma lista de nomes de arquivos

homem grep

-f ARQUIVO, --file=ARQUIVO Obtenha padrões de ARQUIVO, um por linha. O arquivo vazio contém zero padrões e, portanto, não corresponde a nada. (-f é especificado por POSIX.)

Você precisa ter certeza de que todos os metacaracteres em seus nomes de arquivos tenham escape, a menos que você queira que eles sejam tratados como metacaracteres.


$ cat files.txt
/Volumes/Documents - Part 1/July 2009/vacation.pdf
/Volumes/Documents - Part 1/July 2009/pie time!.jpg
/Volumes/Documents - Part 1/July 2009/Coding/Unix/sample.sh
/Volumes/Documents - Part 1/July 2009/trip-to-spain.pages

$ echo a | grep -vf files.txt
a

Parece-me que seu files.txt provavelmente contém mais do que as quatro linhas que você mostra.

Verifique o arquivo usando

$ wc files.txt
  4  21 221 files.txt

$ sum files.txt
43924     1

Em caso de dúvida, use a -Fopção (F maiúsculo) - mas você não escapa dos metacaracteres no arquivo.txt.

Observe o seguinte

$ cat files.txt
/Volumes/Documents - Part 1/July 2009/vacation.pdf
/Volumes/Documents - Part 1/July 2009/pie time!.jpg
/Volumes/Documents - Part 1/July 2009/Coding/Unix/sample.sh
/Volumes/Documents - Part 1/July 2009/trip-to-spain.pages
[z-a]

$ echo aaa | grep -vf files.txt
grep: Invalid range end

$ echo aaa | grep -Fvf files.txt
aaa

A -Fopção informa ao grep que seus padrões de pesquisa não contêm expressões regulares e que devem ser tratados como texto simples.

informação relacionada