역방향 grep이 일치하는 모든 줄을 찾지 못함

역방향 grep이 일치하는 모든 줄을 찾지 못함

편집하다:너무 복잡하게 만들었어요. 이것은 역방향 grep과 관련이 없습니다. 그냥 사용해도 같은 결과를 얻습니다 grep -x -f stop.txt < in.txt. 불용어 파일에서 who앞에 있으면 whose결과는 입니다 who. 불용어 파일의 순서가 바뀌면 in.txt에서 두 줄이 발견됩니다. grep을 전혀 이해하지 못하는 것 같습니다.


파일에서 불용어가 포함된 행을 제거하려는 것처럼 역방향 grep이 작동하도록 할 수 없습니다. 불용어가 제공되는 순서는 결과에 영향을 미칩니다.

두 개의 파일이 있다고 가정 해 보겠습니다. 입력 파일 in.txt:

who
whose

그리고 불용어 목록이 포함된 파일은 다음과 같습니다 stop.txt.

who
whose

in.txt역 grep 검색을 사용하여 의 중지 단어를 "필터링"하면 다음과 같은 결과 stop.txt를 얻습니다.

$ grep -vx -f stop.txt < in.txt
whose
$

stop.txt내가 다음으로 변경하는 경우에만

whose
who

나는 얻다:

$ grep -vx -f stop.txt < in.txt
$

불용어가 포함된 파일의 단어 순서가 왜 중요한지 이해가 되지 않습니다.

답변1

스키마 파일 포함

$ od -bc shortlong
0000000   167 150 157 012 167 150 157 163 145 012
           w   h   o  \n   w   h   o   s   e  \n
0000012
$ od -bc longshort
0000000   167 150 157 163 145 012 167 150 157 012
           w   h   o   s   e  \n   w   h   o  \n
0000012

grep macOS (2.5.1-FreeBSD)를 사용하여 몇 가지 변경 사항을 테스트할 수 있습니다 .

$ grep -x -f shortlong shortlong
who
$ grep -x -f shortlong longshort
who
$ grep -x -f longshort shortlong
who
whose
$ grep -x -f longshort longshort
whose
who

who첫 번째 항목이 더 긴 whose일치 항목을 숨길 때. 이것은 버그인 것 같습니다.

문제는 표현식이 file 에서 나올 때만 발생 -f하며 동등한(희망하는) 표현식이 인수로 제공될 때는 발생하지 않습니다.

$ grep -x -E 'who|whose' shortlong
who
whose
$ grep -x -E 'who|whose' longshort
whose
who
$ grep -x -E 'whose|who' shortlong
who
whose
$ grep -x -E 'whose|who' longshort
whose
who

GNU grep(3.7)에는 이 문제가 없습니다( grep현재 버전의 OpenBSD도 마찬가지입니다):

$ ggrep -x -f shortlong shortlong
who
whose
$ ggrep -x -f shortlong longshort
whose
who
$ ggrep -x -f longshort shortlong
who
whose
$ ggrep -x -f longshort longshort
whose
who

따라서 이 오류를 방지하려면 버전 2.5.1-FreeBSD를 사용하지 않거나 grep비 터미널 값을 for 매개 변수로 바꿔 파일에 정규식을 구성하십시오.\n|grep -E

$ paste -s -d \| shortlong
who|whose
$ grep -x -E -- "$(paste -s -d \| shortlong)" shortlong
who
whose

교대에 대해

이상적으로는 정규식 대체에서 긴 문자열이 짧은 문자열보다 먼저 나열되어야 합니다.다른 극단적인 경우들 중에서이는 사람들이 longshort파일이나 whose|who테이블을 선호해야 함을 의미합니다.

grep(오류가 없는 경우) 올바른 결과를 얻기 위해 나타나지만 다른 정규식 엔진은 첫 번째 일치에서 중지되므로 일치시키려면 가장 긴 일치 항목을 먼저 나열해야 합니다.

$ printf 'who whoses the whosefolk' |
grep -o -E 'who|whose|whosefolk'
who
whose
whosefolk
$ printf 'who whoses the whosefolk' |
perl -nle 'print for /who|whose|whosefolk/g'
who
who
who
$ printf 'who whoses the whosefolk' |
perl -nle 'print for /whosefolk|whose|who/g'
who
whose
whosefolk

관련 정보