편집하다:너무 복잡하게 만들었어요. 이것은 역방향 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