리눅스에서 부정적인 비하인드 / 어 헤드 어설 션


14

를 사용하여 로그에서 .php가없는 "index"의 모든 인스턴스를 찾고 싶습니다 less. /index(?!\.php)작동하지 않습니다. 이게 가능해? less와 vim에 대한 정규식은 무엇입니까? 이 응용 프로그램의 각 정규식 라이브러리로는 불가능합니까?


답변:


22

에서 vim다음과 같이 할 수 있습니다.

/index\(\.php\)\@!

자세한 내용을 보려면 명령 모드에서 다음을 시도하십시오 :h \@.

\@!     Matches with zero width if the preceding atom does NOT match at the
        current position. /zero-width {not in Vi}
        Like '(?!pattern)" in Perl.
        Example                 matches
        foo\(bar\)\@!           any "foo" not followed by "bar"
        a.\{-}p\@!              "a", "ap", "aap", "app", etc. not immediately
                                followed by a "p"
        if \(\(then\)\@!.\)*$   "if " not followed by "then"

아름다운! 적은 아이디어가 있습니까? 이것은 덜 작동하지 않습니다. 정규식 동작이 모든 곳에서 PCRE 였으면 좋겠지 만 아쉽습니다.
Gregg Leventhal

7
negativ lookbehind에 대한 구문도 참고하십시오 .\@<!
lanoxx

그것은 당신이 부정적인 모양을 둘 필요가 있다는 말과 함께 간다 뒤에 패턴 전에. 예 : and 와 \(some\)\@<!thing일치 하지만 . thingeverythingnothingsomething
dwanderson

7

(?!\.php)perl regexp 연산자입니다. less일반적으로 시스템의 POSIX regexp API를 사용하므로 일반적으로 GNU 시스템에서 GNU 확장 정규식은 정규식을 vim사용 vim합니다.

에서는 vim이미 cuonglm 의해 도시 된 바와 같이, 등가의 index(?!\.php)index\(\.php\)\@!또는 \vindex(\.php)@!.

의 경우 less컴파일 타임에 정규식 라이브러리 / API를 선택하고 그 결과 사용할 정규 표현식 유형을 선택할 수 있습니다.

    --with-regex={auto,gnu,pcre,posix,regcmp,re_comp,
                    regcomp,regcomp-local,none}
        Select a regular expression library  auto

그러나 기본적으로 lessPOSIX regcomp를 REG_EXTENDED와 함께 사용 하므로 시스템의 확장 정규 표현식을 얻을 수 grep -E있습니다.

GNU 확장 정규 표현식에서는 뒤를 닮거나 앞을 내다 보는 연산자가 없습니다.

어려운 방법으로 할 수 있습니다.

index($|[^.]|\.($|([^p]|p($|([^h]|h($|[^p]))))))

로 키를 less사용하여 ( )가 &포함 된 행을 필터링 한 다음 ( ) 을 검색 할 수 있습니다. (을 포함하는 행에 나타나는 다른 인스턴스는 여전히 그리워합니다 ).index.php&!index\.phpindex/indexindexindex.php


1
less사용 하는 정규식 라이브러리 는 컴파일 된 시간에 달려 있다고 생각합니다 .
cuonglm

@Gnouc, 당신 말이 맞습니다. 이제 PCRE도 지원합니다.
Stéphane Chazelas

예,의 출력을 구문 분석 less하여 사용 여부를 확인할 수 있습니다 . 그러나 다른 도서관과 함께 확인하는 방법을 알고 있습니까? PCREldd $(which less)
cuonglm

1
@Gnouc에서 정규 표현식 라이브러리의 이름을로 인쇄합니다 less --version.
Stéphane Chazelas

Ubuntu 12.04 LTS를 사용하고와 함께 저작권과 함께 less --verion만 인쇄합니다 less 444.
cuonglm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.