한 글자로 이상한 행동을 듣다


10

코드를 사용하여 텍스트에서 중지 단어를 제거하고 있습니다.

나는 다음을 가지고있다

$ cat file
file
types
extensions

$ cat stopwords
i
file
types

grep -vwFf stopwords file

결과가 기대됩니다. extensions

하지만 나는 (나는 틀렸다고 생각한다)

file
extensions

file스톱 워드 파일에서 단어 를 건너 뛴 것처럼 보입니다. 이제 여기에 시원한 비트가있다 : 나는 한 단어 / 문자 변경함으로써 불용어 파일을 수정하면 i떨어져에서 다른 아스키 문자로, 첫 번째 줄에를 f, i, l, e, 다음 같은 grep 명령은 나에게 다른 및 올바른 결과를 제공합니다 extensions.

여기서 무슨 일이 일어나고 있으며 어떻게 해결합니까?

Mac OSX GNU bash 버전 4.4.12 (1)에서 grep (BSD grep) 2.5.1-FreeBSD를 사용하고 있습니다.


단어 -x대신 라인 정규식에 스위치 를 사용할 수 -w있습니까? 그러나 -F스위치가 둘 중 하나를 취소하거나 그 반대로 취소 한다고 생각합니다 .
jesse_b

grep (GNU grep) 3.1이 예상대로 작동합니다.
Hauke ​​Laging

나는 이것을 복제했다. 또 다른 기준 : i패턴을 stopwords파일 의 첫 번째 패턴이 아닌 두 번째로 설정 하면 동작이 변경됩니다.
JdeBP

네이티브 grep또는 GNU grep3.1을 사용하여 OpenBSD 6.2의 동작을 재현 할 수 없습니다 .
Kusalananda

답변:


13

bsdgrep여러 패턴이 관련 될 때 정규 표현식 일치 엔진을 연속적으로 호출하여 덮어 쓰는 현재 행의 일부를 추적하는 변수와 관련된 버그입니다 .

지역 수정

-w올바른 조작을 위해이 변수에 의존하고 실패 하는 옵션을 사용하지 않고이 문제를 어느 정도 해결할 수 있습니다. 대신 단어의 시작과 끝과 일치하는 정규 표현식 확장자를 사용하여 stopwords파일을 다음과 같이 만듭니다 .

\ <i \>
\ <파일 \>
\ <종류 \>

이 해결 방법은 -F옵션을 사용하지 않아도됩니다 .

있습니다 문서화 된 정규 표현식 구성 요소 [[:<:]][[:>:]]것을 re_format매뉴얼 알려줍니다에 대한 것입니다 하지 여기에 작동합니다. 컴파일 된 정규식 라이브러리에 bsdgrepGNU 정규식 호환성 지원 이 설정되어 있기 때문 입니다. 이것은 또 다른 버그이며 수정 된 것으로 알려졌습니다.

서비스 수정

이 버그는 올해 초 수정되었습니다. 이 수정은 아직 FreeBSD의 STABLE 또는 RELEASE 버전으로 수정되지 않았지만 현재 CURRENT에 있습니다.

이것을 grepFreeBSD에서 파생 된 MacOS 버전으로 가져 bsdgrep오려면 Apple에 문의하십시오. ☺

추가 자료


이 업스트림을보고 해 주셔서 감사합니다. 버그가 많은 코드를 인용하면이 답변이 훨씬 더 매력적이라는 것을 알 수 있습니다.
dhag

1

이 코드는 :

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

brew를 통해 그리고 sourceforge에서 사용 가능한 cgrep에 대한 자세한 내용 :

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


나 자신에게 새로운 grep을 얻었다.
Tim

@Tim-cgrep이 유용하게 사용되기를 바랍니다. 내가 한 테스트의 속도는 GNU grep과 거의 비슷한 수준이며 "context / windowing"기능은 매우 유용합니다. 그것은 또한 리눅스 시스템에서 쉽게 빌드됩니다 ... cheers, drl
drl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.