대략적으로 이것을 사용하여 텍스트에서 불용어를 제거하고 있습니다. 암호
나는 다음을 가지고 있습니다
$ cat file
file
types
extensions
$ cat stopwords
i
file
types
grep -vwFf stopwords file
나는 결과를 기대하고 있습니다 :
extensions
하지만 알겠어(맞지 않은 것 같아)
file
extensions
이는 마치 file
불용어 파일에서 해당 단어를 건너뛴 것과 같습니다. 이제 멋진 점은 다음과 같습니다. i
첫 번째 줄의 단일 단어/문자를 , ,를 제외한 다른 ASCII 문자로 변경하여 f
불용어 i
파일 l
을 수정하면 e
동일한 grep 명령이 다르고 올바른 결과를 제공합니다 extensions
.
어떻게 되어가나요? 어떻게 해결할 수 있나요?
Mac OSX GNU bash 버전 4.4.12(1)에서 grep(BSD grep) 2.5.1-FreeBSD를 사용하고 있습니다.
답변1
bsdgrep
이는 아직 스캔해야 하는 현재 줄의 부분을 추적하는 변수와 관련된 의 버그였습니다. 이 부분 은 여러 패턴이 포함될 때 정규식 일치 엔진에 대한 연속 호출로 덮어쓰게 됩니다.
로컬 수정
-w
이 변수를 사용하여 올바르게 작동하므로 실패하는 옵션을 사용하지 않고 대신 단어의 시작과 끝과 일치하는 정규식 확장을 사용하여 stopwords
파일을 다음과 같이 만들어 이 문제를 어느 정도 해결할 수 있습니다 .
\<나\> \<파일\> \<유형\>
또한 이 해결 방법을 사용하려면 이 옵션을 사용하지 않아야 합니다 -F
.
참고하시기 바랍니다,녹음된정규식 구성요소 [[:<:]]
와 [[:>:]]
매뉴얼에서 re_format
말하는 내용아니요여기서 일하세요. 이는 정규식 라이브러리가 bsdgrep
GNU 정규식 호환성 지원이 활성화된 상태로 컴파일되기 때문입니다. 이는 수정된 것으로 보고된 또 다른 버그입니다.
서비스 수리
해당 버그는 올해 초에 수정되었습니다. 수정 사항은 아직 FreeBSD의 STABLE 또는 RELEASE 릴리스에 포함되지 않았지만 현재 있는 것으로 보고되었습니다.
grep
FreeBSD 파생 버전의 MacOS에 포함하려면 bsdgrep
Apple에 문의하세요. ☺
추가 읽기
- 조나단 드 보인 폴라드(2017-10-15).여러 스키마가 제공되면 bsdgrep이 잘못 동작함. 버그 #223031. FreeBSD 버그질라.
- 카일 에반스(2017-04-03).bsdgrep: 일치 동작 수정. 개정 316477. FreeBSD 소스 코드.
- 카일 에반스(2017-05-02).bsdgrep: 일부 패턴과 -w -v의 잘못된 일치 수정 . 개정 317665. FreeBSD 소스 코드.
- 네이선 윅스(2014-06-16).grep(1) 및 bsdgrep(1)은 [[:<:]] 및 [[:>:]]를 인식하지 못합니다.. 버그 #191086. FreeBSD 버그질라.
답변2
이 코드는:
pl " Input data file data1 and stopwords file data2:"
head data1 data2
pl " Expected output:"
cat $E
pl " Results, grep:"
# grep -vwFf stopwords file
grep -vwFf data2 data1
pl " Results, cgrep:"
cgrep -x1 -vFf data2 data1
생산하다:
-----
Input data file data1 and stopwords file data2:
==> data1 <==
file
types
extensions
==> data2 <==
i
file
types
-----
Expected output:
extensions
-----
Results, grep:
file
extensions
-----
Results, cgrep:
extensions
이러한 시스템에서는:
OS, ker|rel, machine: Apple/BSD, Darwin 16.7.0, x86_64
Distribution : macOS 10.12.6 (16G29), Sierra
bash GNU bash 3.2.57
cgrep에 대한 자세한 내용은 Brew 및 Sourceforge를 통해 확인할 수 있습니다.
cgrep shows context of matching patterns found in files (man)
Path : ~/executable/cgrep
Version : 8.15
Type : Mach-O64-bitexecutablex86_64 ...)
Home : http://sourceforge.net/projects/cgrep/ (doc)
건배, drl