grep이 '잘못된 문자 범위'라고 말합니다.

grep이 '잘못된 문자 범위'라고 말합니다.

그래서 저는 일반 텍스트 문서에서 파일 이름 목록을 필터링하기 위해 find및 의 조합을 사용하고 있습니다 .grep

내가 실행하는 명령은 다음과 같습니다.

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

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

일치하지 않는 줄을 출력하고 싶지만 대신 다음과 같은 결과가 나타납니다.

grep: invalid character range

이것의 원인은 무엇입니까? files.txt에는 더 많은 내용이 있습니다. 너무 길기 때문에 생략했습니다. 거기에도 여러 개의 유니코드 문자가 있습니다. 그게 문제를 일으킬 수 있나요?

Mac OS X Yosemite, bash 3.2.57(1)-릴리스, grep(BSD grep) 2.5.1-FreeBSD

답변1

TLDR; 추가하다-F


grep 옵션 -f은 다음 목록이 포함된 파일을 참조하는 데 사용됩니다.패턴- 파일에 패턴 목록이 포함되어 있지 않지만 파일 이름 목록이 포함되어 있습니다.

남자 grep

-f FILE, --file=FILE FILE에서 한 줄에 하나씩 패턴을 가져옵니다. 빈 파일에는 패턴이 0개 포함되어 있으므로 일치하는 항목이 없습니다. (-f는 POSIX에 의해 지정됩니다.)

메타 문자로 처리되기를 원하지 않는 한 파일 이름의 모든 메타 문자가 이스케이프되었는지 확인해야 합니다.


$ 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

제가 보기에는 귀하의 files.txt에 표시된 4줄보다 더 많은 내용이 포함되어 있을 것 같습니다.

다음을 사용하여 파일을 확인하십시오.

$ wc files.txt
  4  21 221 files.txt

$ sum files.txt
43924     1

의심스러운 경우 -F옵션(대문자 F)을 사용하세요. 하지만 file.txt에서 메타 문자를 이스케이프 처리할 수는 없습니다.

다음 사항에 유의하세요.

$ 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

-F옵션은 검색 패턴에 정규식이 포함되어 있지 않으며 일반 텍스트로 처리해야 함을 grep에 지시합니다.

관련 정보