'grep -i'가 왜 그렇게 느린가요? ASCII에서 더 빨리하는 방법?


2

치다:

$ time lzop -d < tvtropes-index.lzo | egrep -B 5 '[Dd][eE][sS][cC][eE][nN][dD] ?[Ff][rR][oO][mM]'
real    0m0.438s

$ time lzop -d < tvtropes-index.lzo | egrep -B 5 'descend ?from' -i
real    0m11.294s

둘 다 대소 문자를 구분하지 않습니다. -i버전 이 왜 이렇게 느린가요? grep -i[iI] [nN] [tT] [hH] [iI] [sS] [wW] [aA] [Yy]와 같은 항목을 입력하지 않고 어떻게 빠르게 만들 수 있습니까?

예를 들어

perl -ne 'print if /descend ?from/i'

빨리 작동하지만 '-B 5'는 grep (및 기타 옵션) 에서처럼 구현하기가 쉽지 않습니다.


1
대 / 소문자 구분은 특히 유니 코드 입력에서 수행하는 경우 어렵습니다.
phogg

예를 들어 "패턴에서 모든 x를 [xX]로 교체"와 같이 대소 문자를 구분하지 않는 빠른 방법은 무엇입니까?
Vi.

답변:


7

케이스 꺾어 접어 어렵다

[az]를 [AZ]로 간단히 매핑하면 가장 간단한 ASCII 전용 텍스트 문서에 사용할 수 있습니다. 그러나 추가 문자를 사용하는 다른 언어를 탐색함에 따라 분류가 시작됩니다. 또한 일부 언어의 대소 문자 매핑이 항상 알고리즘 적이거나 정적 인 것은 아니라는 사실도 고려하지 않습니다.

예를 들어, [az]-> [AZ]로 접은 경우 "Dürst"또는 "résumé"과 같은 문자열은 "DüRST"또는 "RéSUMé"과 같이 조금 이상하게 보일 수 있습니다.

고대 grep을 사용하거나 로케일 (LC_ALL = C?)을 사용하여 세계가 다시 ASCII라는 grep을 설득하여 속도를 높일 수 있습니다.

이 대화 에서는 "UTF8 로케일의 막대한 속도 저하"에 대해 언급하지만 도움이되지 않습니다.


grep에 ASCII 전용 빠른 대소 문자 구분 모드가 있습니까? LANG=C grep -i실패합니다 (느리게).
Vi.

@Vi : lzop -d < thingy | tr '[A-Z]' '[a-z]' | grep ... 아마도 요?
RedGrittyBrick

1
"LANG = C grep -i"가 작동합니다 (다시 올바르게 테스트).
Vi.


0

찾기의 실제 사례가 중요하지 않은 경우, 사용할 수 tr폴드 [A-Z][a-z]전과 grep.


나는 더 간단한 정규식을 작성하기 위해 그렇게 할 것입니다. 대소 문자를 구분하지 않는 정규 표현식이 더 큰 DFA로 확대되지만 큰 문제는 아닙니다. 일치하는 항목 수에 따라 다릅니다. 파일에 가능한 많은 대소 문자 조합을 사용하는 많은 오 탐지 또는 완전 일치 항목이있는 경우 상태 그래프가 CPU에서 잘못 캐시됩니다. 아마 일어나지 않을 것입니다. DESCEND와 같은 몇 가지 사례 만있을 것입니다. 정규식 DFA를 통해 동일한 "잘 평가 된"경로를 통과하는 내림차순을 내립니다.
Kaz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.