\{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\}
. a
0번 발생은 위에 지정된 사양에서 일치하지 않는 길이보다 긴 것으로 간주되는 빈 문자열을 의미합니다.
사용법의 문제점은 대체 명령 g
의 전역 플래그를 사용하지 않는다는 것입니다 sed
s
. 로컬 플래그가 없으면 g
첫 번째 일치 항목(줄 시작 부분의 빈 문자열)이 발견되자마자 교체가 중지됩니다 sed
.s
일반적인 형식은 \{m,n\}
with 0 <= m <= n <= RE_DUP_MAX
이며 대부분의 플랫폼에서 다음 과 RE_DUP_MAX
같습니다.32767
$ getconf RE_DUP_MAX
32767