sed에서 정규식 [0-9]{0,2}가 탐욕적이지 않은 이유는 무엇입니까?

sed에서 정규식 [0-9]{0,2}가 탐욕적이지 않은 이유는 무엇입니까?
echo '123980925sriten34=ienat' | sed -e 's/^.*\?\([1-9][0-9]\{0,2\}\+\)\([%=+-]\).*/ \1 \2 /'

결과를 제공하고 있습니다 :

 4 =

나는 기대한다:

 34 =

내가 이해하지 못하는 것은 무엇입니까?

+(아, 그리고 ?확실히 추가하기까지 했지만 , 내가 아는 한 {0,2}그것들 없이는 욕심이 많을 것입니다.)

답변1

질문,스틸드라이버가 말했듯이[0-9]{0,2}, 이거 욕심 없는 거 아냐 ? 문제는 .*?이전에도 욕심이 많았다는 것이다.  sed BRE 및 ERE가 지원되며 둘 다 비탐욕적 일치를 지원하지 않습니다. 이것이 PCRE의 특징입니다. 예를 들어 다음 명령은 다음과 같습니다.

$ echo 'aQbQc' | sed    's/.*\?Q/X/'
$ echo 'aQbQc' | sed    's/.*Q/X/'
$ echo 'aQbQc' | sed -r 's/.*?Q/X/'
$ echo 'aQbQc' | sed -r 's/.*Q/X/'

모든 출력

Xc

(왜 무시되는지 모르겠습니다 ?.)

바라보다SED 정규 표현식과 비탐욕적 일치(perl의 에뮬레이션 .*?).

수행하려는 작업에 대한 귀하의 설명은 피상적이지만 저는 그것을 리버스 엔지니어링했다고 믿습니다. 를 통해 원하는 효과를 얻을 수 있습니다. 불일치일치시키려는 숫자 앞의 문자를 찾으십시오.

$ echo '123980925sriten34=ienat' | sed -e 's/\([1-9][0-9]\{0,2\}\+\)\([%=+-]\).*/! \1 \2 /' -e 's/.*!//'
 34 =

!입력 데이터에 나타나지 않는 것으로 알려진 문자열로 대체됩니다 . 그러한 문자열이 없지만 GNU sed를 사용하는 경우 개행 문자를 사용할 수 있습니다.

$ echo '123980925sriten34=ienat' | sed -e 's/\([1-9][0-9]\{0,2\}\+\)\([%=+-]\).*/\n \1 \2 /' -e 's/.*\n//'
 34 =

물론 이것은 불가능하다존재하다모든 라인.

관련 정보