정규식 패턴 "?!"이 grep을 사용하지 않는 이유는 무엇입니까? [복사]

정규식 패턴 "?!"이 grep을 사용하지 않는 이유는 무엇입니까? [복사]

-v파일에서 단일 단어를 제외하는 데 사용할 수 있지만 정규식 패턴이 / ?!에서 작동하지 않는 이유가 궁금합니다 .grepegrep

편집기에서 파일 검색에서 단일 단어를 제외하는 패턴을 찾다가 atom발견했습니다.이것협회. 이 ?!기능은 에서 완벽하게 작동합니다 atom. bash먼저 닫아야 합니다. histexpand그렇지 않으면 set +H검색 기록이 표시됩니다 -bash: !xxx: event not found. 그런 !pattern다음 비슷한 것을 시도했지만 패턴 을 인식할 수 없었습니다 . 왜 이런 일이 발생합니까?echo "no" | grep "^(?!yes).*"grep?!

답변1

$ echo "no" | grep -P '^(?!yes).*'
no

이 표현식은 표준 기본 정규 표현식이나 표준 확장 정규 표현식이 아니라 "Perl Compatible Regular Expression"을 의미하는 PCRE입니다. 플래그와 함께 유틸리티를 사용하면 GNU는 grep이에 대해 알고 있습니다 -P.

표현식을 작은따옴표로 묶으면(정적 문자열이므로 그렇게 해야 함) 확장 패턴이 기록 패턴으로 bash인식되지 않습니다 ?!yes.

GNU grep매뉴얼에서:

-P,--perl-regexp

패턴을 Perl 호환 정규식(PCRE)으로 해석합니다. 이는 실험적이며 grep -P구현되지 않은 기능에 대해 경고할 수 있습니다.

bash매뉴얼 에서 (필자의 강조):

\백슬래시( ) 만그리고 작은 따옴표역사적 확장 문자는 인용될 수 있지만, 큰따옴표로 묶인 문자열에서 닫는 큰따옴표 바로 앞에 있는 경우에도 인용된 것으로 간주됩니다.

관련 정보