로컬 수정

로컬 수정

대략적으로 이것을 사용하여 텍스트에서 불용어를 제거하고 있습니다. 암호

나는 다음을 가지고 있습니다

$ 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말하는 내용아니요여기서 일하세요. 이는 정규식 라이브러리가 bsdgrepGNU 정규식 호환성 지원이 활성화된 상태로 컴파일되기 때문입니다. 이는 수정된 것으로 보고된 또 다른 버그입니다.

서비스 수리

해당 버그는 올해 초에 수정되었습니다. 수정 사항은 아직 FreeBSD의 STABLE 또는 RELEASE 릴리스에 포함되지 않았지만 현재 있는 것으로 보고되었습니다.

grepFreeBSD 파생 버전의 MacOS에 포함하려면 bsdgrepApple에 문의하세요. ☺

추가 읽기

답변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

관련 정보