sed \{x,y\}의 범위가 탐욕적입니까?

sed \{x,y\}의 범위가 탐욕적입니까?

\{x,y\}예를 들어, in이 sed가능한 한 많은 문자 또는 적은 문자와 일치하려고 시도하는지 알고 싶습니다 .

또한 누군가 다음의 예상치 못한 동작을 나에게 설명해 줄 수 있습니까 sed?

echo "baaab" | sed 's/a\{1,2\}//'
bab

echo "baaab" | sed 's/a\{0,2\}//'
baaab

첫 번째 줄에서는 sed욕심이 생기고, 두 번째 줄에서는 당연히 아닌데, 이유가 있나요?

저는 GNU sed 버전 4.2.1을 사용하고 있습니다.

답변1

a\{0,2\}줄 시작 부분의 빈 문자열과 일치합니다(실제로 빈 문자열이지만 g지정되지는 않음).

$ echo "baaab" | sed 's/a\{0,2\}/y/' 
ybaaab

GNU는 sed왼쪽에서 오른쪽으로 일치하고 전역 대체가 지정되지 않았으므로 줄의 시작 부분만 일치됩니다. 다음을 사용한 경우 g:

$ echo "baaab" | sed 's/a\{0,2\}/y/g'
ybyyby

선행 및 후행 빈 문자열 및 aa나머지 와 일치합니다 a.

답변2

예, 탐욕입니다.

POSIX 호환 시스템에서는 sed사용되는 모든 도구 뿐만 아니라기본 정규식, 이것일치하는 패턴은 항상 탐욕적입니다.:

일치하는 시퀀스에 대한 검색은 문자열의 시작 부분에서 시작하고 표현식과 일치하는 첫 번째 시퀀스가 ​​발견되면 중지됩니다. 여기서 "first"는 "문자열에서 가장 빠른 시작"을 의미하도록 정의됩니다. 패턴이 일치하는 문자의 가변 수를 허용하므로 해당 지점에서 시작하는 이러한 시퀀스가 ​​여러 개 있는 경우,가장 긴 시퀀스와 일치. 예를 들어, BRE "bb*"는 문자열 "abbbc"의 두 번째에서 네 번째 문자와 일치하고, ERE "(wee|week)(knights|night)"는 "weeknights" 문자열의 10개 문자 모두와 일치합니다.

전체 일치 항목이 가장 왼쪽 일치 항목 중 가장 긴 항목과 일치하도록 각 하위 패턴은 왼쪽에서 오른쪽으로 가능한 가장 긴 문자열과 일치해야 합니다. 이 목적을 위해,빈 문자열은 전혀 일치하지 않는 것보다 긴 것으로 처리되어야 합니다.. 예를 들어 BRE "(.).”는 “abcdef”와 일치하고 하위 표현식 “(\1)”은 “abcdef”이며 “bc” BRE “(a*)*”와 일치하며 하위 표현식 “(\1)”은 빈 문자열입니다.

이 패턴은 0에서 2 사이의 모든 문자와 일치합니다 a\{0,2\}. a0번 발생은 위에 지정된 사양에서 일치하지 않는 길이보다 긴 것으로 간주되는 빈 문자열을 의미합니다.

사용법의 문제점은 대체 명령 g의 전역 플래그를 사용하지 않는다는 것입니다 sed s. 로컬 플래그가 없으면 g첫 번째 일치 항목(줄 시작 부분의 빈 문자열)이 발견되자마자 교체가 중지됩니다 sed.s


일반적인 형식은 \{m,n\}with 0 <= m <= n <= RE_DUP_MAX이며 대부분의 플랫폼에서 다음 과 RE_DUP_MAX같습니다.32767

$ getconf RE_DUP_MAX
32767

관련 정보