grep diz 'intervalo de caracteres inválidos'

0

Estou usando uma combinação de find e grep para filtrar uma lista de nomes de arquivos de um documento de texto simples.

Aqui está o comando que eu executo:

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

Em arquivos.txt eu tenho isto:

/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

Eu quero que ele exiba todas as linhas não correspondentes, mas em vez disso eu obtenho isto:

grep: invalid character range

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

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

    
por leetbacoon 30.03.2018 / 17:04

1 resposta

0

TLDR; adicione -F

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

homem grep

-f FILE, --file=FILE Obtain patterns from FILE, one per line. The empty file contains zero patterns, and therefore matches nothing. (-f is specified by POSIX.)

Você precisa ter certeza de que quaisquer metacaracteres nos seus nomes de arquivo sejam de 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 o seu arquivo.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 opção -F (letra maiúscula F) - mas você não escapará 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 opção -F diz ao grep que seus padrões de pesquisa não contêm expressões regulares e que deve tratá-los como texto simples.

    
por 30.03.2018 / 17:21