sed 정규식에서 [\w]+를 사용하는 방법은 무엇입니까?

sed 정규식에서 [\w]+를 사용하는 방법은 무엇입니까?

나는 Windows를 사용하고 있지만 내 질문이 여전히 여기에 올바르게 배치되어 있다고 생각합니다.

C:\Users\User>grep --version
GNU grep 2.6.3

C:\Users\User>sed --version
GNU sed version 4.2.1

다음과 같은 작업이 수행되는 것을 확인했습니다(출력 here).

echo here | grep -E "\w+"
echo here | grep -E "[her]+"

그러나 이는 작동하지 않습니다(아무것도 출력되지 않음).

echo here | grep -E "[\w]+"

그러면 다음과 같이 출력됩니다 here.

echo here | grep -P "[\w]+"

나는 이것이 [\w]Perl 정규 표현식에만 해당되는 것이라고 생각합니다. 그렇죠?

그럼 얘기 좀 해보자 sed. 이것은 작동합니다(출력 gone):

echo here | sed -r "s/\w+/gone/"
echo here | sed -r "s/[her]+/gone/"

다시 말하지만, 이는 다음과 here같이 출력되지 않습니다.

echo here | sed -r "s/[\w]+/gone/"

이제 sed의 Perl 정규식을 어떻게 활성화할 수 있습니까? 어떤 방법이 있습니까?

답변1

다양한 도구와 해당 버전은 다양한 정규식 변형을 지원합니다. 각 문서에 지원되는 내용이 나와 있습니다.

표준은 모든 표준 호환 애플리케이션에서 사용할 수 있는 최소한의 기능 세트에 의존할 수 있도록 존재합니다.

예를 들어, POSIX에서 지정한 기본 정규식의 모든 최신 구현 sed및 구현(적어도 하나의 버전 또는 다른 표준이 있지만 지난 수십 년 동안 이 점에서 표준은 크게 발전하지 않았습니다).grep

[:alnum:]POSIX BRE 및 ERE에는 문자 클래스가 있습니다 . 이는 해당 로케일의 문자 및 숫자와 일치합니다( a-zA-Z0-9로케일이 C가 아닌 한 일반적으로 더 많은 문자가 포함됩니다 ).

그래서:

grep -x '[[:alnum:]_]\{1,\}'

하나 이상의 alnum 또는 _와 일치합니다.

[\w]POSIX에는 일치하는 백슬래시 또는 가 필요하므로 사용 가능 하거나 구현을 w찾을 수 없습니다 (비표준 옵션을 통한 경우 제외).grepsed

POSIX는 alone 의 동작을 지정하지 않으므로 \w구현이 원하는 것을 수행할 수 있습니다. GNU는 grep이것을 오래 전에 추가했습니다.

GNU에는 grep자체 정규식 엔진이 있었지만 이제는 GNU libc 엔진을 사용합니다(자체 복사본이 포함되어 있음).

해당 로케일의 숫자와 밑줄이 일치하도록 설계되었습니다. 그러나 현재 단일 바이트 문자만 일치한다는 버그가 있습니다. 예를 들어 UTF-8 로케일에서는 분명히 문자임에도 불구하고 é와 일치하지 않으며 é가 단일 문자인 모든 로케일에서는 일치합니다. e) 특징).

\wPerl regexp와 PCRE에도 정규식 연산자가 있습니다. PCRE/perl은 POSIX 정규 표현식이 아니며 완전히 다른 것입니다.

이제 GNU가 PCRE를 사용하는 방식으로 인해 grep -PPCRE가 없을 때와 동일한 문제가 발생합니다 -P. 그러나 이 문제는 다음을 사용하여 해결할 수 있습니다 (*UCP)(비UTF8 로케일에서는 부작용도 있지만).

GNU는 sed또한 GNU libc의 정규식을 자체 정규식으로 사용합니다. 그런 식으로 사용하지만 GNU와 같은 버그는 없습니다 grep.

GNU는 sedPCRE를 지원하지 않습니다. 코드에는 이전에 시도된 적이 있다는 증거가 있지만 더 이상 의제가 아닌 것 같습니다.

Perl의 정규 표현식을 원하면 perlbut을 사용하세요.

sed그렇지 않으면 / 의 특정 구현의 허위 비표준 기능에 의존하기보다는 grep표준을 고수하고 을 사용하십시오 [_[:alnum:]].

답변2

당신 말이 맞습니다. \wPCRE의 일부인 Perl 호환 정규식이 있습니다. 그러나 이는 "표준" 정규식의 일부가 아닙니다.http://www.regular-expressions.info/posix.html

일부 버전에서는 sed이를 지원할 수 있지만 가장 쉬운 방법은 perl플래그를 지정하여 모드에서 사용하는 것입니다. (와 함께). (자세한 내용은 참조sed-p-eperlrun)

하지만 이 예에서는 이를 둘러쌀 필요가 없습니다 []. 이는 페이로드 그룹을 위한 것입니다.

echo here  | perl -pe 's/\w+/gone/'

또는 Windows의 경우:

C:\>echo here  | perl -pe "s/\w+/gone/"
gone
C:\>echo here  | perl -pe "s/[\w\/]+/gone/"
gone

바라보다perlrePCRE에 대해 자세히 알아보세요.

여기에서 Perl을 얻을 수 있습니다: http://www.activestate.com/activeperl/downloads

답변3

grep나는 이것이 의심스럽고 sed적용 시기 []와 확장 시기를 다르게 결정하고 있습니다 \w. Perl에서 정규식은 \w모든 단어 문자를 나타내고 []그 안에 있는 문자를 일치 항목으로 적용하는 그룹을 정의합니다. \w이전에 "확장" 하면 []모든 단어 문자에 대한 문자 클래스가 됩니다. 대신 []이 작업을 먼저 수행하면 두 개의 문자를 포함하는 문자 클래스가 생성되므로 \해당 w두 문자 중 하나 이상을 포함하는 모든 패턴과 일치합니다.

따라서 및 do 와 같은 특수 시퀀스를 존중하기 보다는 일치시킬 정확한 문자를 포함하는 것으로 sed취급하는 것 같습니다 . 물론 이 예에서는 전혀 필요하지 않지만 이것이 중요한 상황을 상상할 수도 있지만 괄호와 or를 사용하여 작동하도록 만들 수도 있습니다.[]\wperlgrep[]

관련 정보