![정규식 패턴 "?!"이 grep을 사용하지 않는 이유는 무엇입니까? [복사]](https://linux55.com/image/133226/%EC%A0%95%EA%B7%9C%EC%8B%9D%20%ED%8C%A8%ED%84%B4%20%22%3F!%22%EC%9D%B4%20grep%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
-v
파일에서 단일 단어를 제외하는 데 사용할 수 있지만 정규식 패턴이 / ?!
에서 작동하지 않는 이유가 궁금합니다 .grep
egrep
편집기에서 파일 검색에서 단일 단어를 제외하는 패턴을 찾다가 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
매뉴얼 에서 (필자의 강조):
\
백슬래시( ) 만그리고 작은 따옴표역사적 확장 문자는 인용될 수 있지만, 큰따옴표로 묶인 문자열에서 닫는 큰따옴표 바로 앞에 있는 경우에도 인용된 것으로 간주됩니다.