grep에서 작동하지 않는 올바른 정규 표현식

grep에서 작동하지 않는 올바른 정규 표현식

이 정규식이 있습니다.

(?<=prefix).*$

문자열의 "접두사" 뒤에 오는 모든 문자를 반환하며 모든 온라인 정규식 엔진(예:https://regex101.com). 문제는 bash에서 이 정규식을 사용할 때입니다.

grep '(?<=prefix).*$' <<< prefixSTRING

아무것도 일치하지 않습니다. 정규 표현식이 grep에서 작동하지 않는 이유는 무엇입니까?

답변1

올바른 정규식을 정의한 것 같지만 grep이를 이해할 수 있을 만큼 명령줄에 충분한 플래그를 설정하지 않았습니다. BRE는 기본적으로 지원 grep되고 플래그를 사용하므로 -EERE를 지원합니다. 당신이 가지고 있는 것(미리보기)은 PCRE 정규식 버전에서만 사용할 수 있으며, 이는 플래그 grep가 있는 -PGNU에서만 지원 됩니다.

추출해야한다고 가정 해 보겠습니다.오직인쇄에 알리 려면 문자열을 일치시킨 후 prefix추가 플래그를 추가해야 합니다.-ogrep오직일치하는 부분은

grep -oP '(?<=prefix).*$' <<< prefixSTRING

grep기본적으로 PCRE 라이브러리를 지원하는 버전 도 있습니다 .pcregrep넌 그 안에서 할 수 있어

pcregrep -o '(?<=prefix).*$' <<< prefixSTRING

다양한 정규식 스타일에 대한 자세한 설명은 이 훌륭한 기사에 설명되어 있습니다.자일스의 대답그리고 이를 구현하기 위한 도구

답변2

정규 표현식은 다양한 형태로 제공됩니다. 당신이 보여주고 있는 것은 Perl과 유사한 정규 표현식(PCRE, "Perl 호환 정규 표현식")입니다.

grepPOSIX 정규식을 실행합니다. 이것들은 모두기본 정규식(브레이) 그리고확장 정규식(ERE, grepoptions 와 함께 사용되는 경우 -E) 시스템에서 참조하는 매뉴얼 re_format이나 유사한 매뉴얼 이나 방금 링크한 POSIX 표준 텍스트를 참조하세요.regexgrep

GNU를 사용하고 GNU 특정 옵션과 함께 사용하면 grepPerl과 유사한 정규식을 사용할 수 있습니다.grepgrep-P

grep반품 도 참고하세요철사기본적으로 줄 내의 하위 문자열은 아닙니다. 마찬가지로, GNU grep(및 일부 다른 grep구현)의 경우 이 -o옵션을 사용하여 행당 주어진 표현식과 일치하는 비트만 얻을 수 있습니다.

-P및 및 모두 비표준 -o확장입니다.POSIX 사양grep.

GNU를 사용하지 않는 경우 이를 사용하여 문자열과 줄 끝 사이의 비트를 가져올 grep수 있습니다 .sedprefix

sed -n 's/.*prefix\(.*\)/\1/p' file

이것이 하는 일은 sed주어진 교체를 적용한 행만 인쇄하는 것입니다. 교체는 표현식(BRE)과 일치하는 전체 줄을 문자열의 뒷부분에 나타나는 부분으로 바꿉니다 prefix.

prefix행에 여러 인스턴스가 있는 경우 sed변형은 다음을 반환합니다.마지막1, GNU grep변형은 다음 문자열을 반환합니다.첫 번째하나(포함된 다른 인스턴스 중 prefix).

sed솔루션은 모든 Unix 계열 시스템에 이식 가능합니다.

답변3

다른 답변에서 언급했듯이 Lookbehinds(기본적으로 GNU 또는 다른 버전) grep와 함께 정규식 스타일을 사용하지 마십시오 .grep

GNU greppcregrep.perl

해당 명령줄은 다음과 같습니다 perl.

perl -ne 'print if /(?<=prefix).*$/' <<< prefixSTRING

슬래시 사이에 원하는 정규식을 입력합니다. Perl을 사용할 때 이것은 다음을 사용합니다.Perl의 정규식 스타일.

관련 정보