2010-03-24 2 views
8

Stack Overflow에서 몇 가지 "정규식을 어떻게 반전합니까?"라는 질문이 있지만 vim을 찾을 수 없습니다 (존재하는 경우 Google-fu는 오늘 부족함).vim의 정규식 반전

본질적으로 모든 인쇄 할 수없는 문자를 일치시키고 삭제하고 싶습니다. 짧은 스크립트를 작성하거나 쉘로 옮겨서 tr이나 비슷한 것을 쓸 수도 있지만 vim 솔루션은 멋있을 것입니다 :-)

Vim은 인쇄 가능한 문자와 일치하도록 \p의 원자를 가지고 있습니다. 역함과 일치하는 :s/[^\p]//g이 실패하고 파일의 모든 'p'가 표시됩니다. 나는 다른 질문에 (?!xxx) 시퀀스를 보았고 vim은이 시퀀스를 인식하지 못하는 것 같습니다. 나는 인쇄 할 수없는 문자에 원자를 찾지 못했습니다. 중간에

, 나는 외부 도구로 떨어질거야,하지만 누군가가이 일을 자신의 소매를 어떤 트릭을 가지고 있다면, 그것은 환영 :-)

따 것!

+0

Perl/pcre'(?! xxx)'표현식은'\ (xxx \) \ @! '와 같은 의미입니다. Vim 표현식이지만이 방법이 도움이 될 것이라고 생각하지 않습니다. – ZyX

답변

10

\p을 문자 클래스로 입력 할 수는 없지만 좋은 기능입니다. 그러나 당신은 당신의 검색을 구축하기 위해 음 내다 기능 \@!를 사용할 수 있습니다

/\p\@!. 

이 먼저가 \p 문자가 아닌 경우 . 만 일치 할 수 있는지 확인합니다.

+0

최고의 물건 - 그 일을했다, 환호 :-) –

1

\ p를 사용할 수없는 이유가 조금 혼란 스럽습니다. 그러나, [: 인쇄 :] 잘 작동합니다 :

:s/[^[:print:]]//g 
+2

이것은 unicode를 지원하지 않습니다 :'echo "Å"= ~ '[[: print :]] ""Å "= ~'\ p"는'0 1'이됩니다. – ZyX

+2

@ ZyX : 잘 잡습니다. 왜'[: print :]'에 인쇄 가능한 유니 코드 문자가 포함되어 있지 않은지 궁금합니다. – Cascabel

+0

(2 년 후) ... 나는 원래이 질문에 어떤 질문을했는지 기억이 나지 않지만, vim 7.3 (현재 내가 설치 한 것)에서'[: print :]'는 유니 코드를 지원합니까? , @ZyX의 위는 (정확하게)'1 1'을 반환합니다. –

1

유니 코드로 파일을 필터링하려면 인쇄 가능한 문자, 당신은 세 단계로이 작업을 수행 할 수있다 (fileencoding = UTF-8은 경우에만) : 모든 인쇄 가능한 문자를 표시 (

다음
%s/\p\@<=/<ffff>/g 
%s/[^<ffff>]<ffff>\@!//g 
%s/<ffff>//g 

당신이 실제 문자로 <ffff>를 교체해야하지 사용되는 UTF-8 기호 (예를 들어, nr2char(0xFFFF)과), 마지막으로,이 기호를 삭제,이 기호 뒤에되지 않은 모든 문자를 삭제하고 형식을 <ffff> 대신 입력하면됩니다.

유니 코드로 작업하지 않는 경우 dsummersl의 대답을 사용하십시오.