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 =
물론 이것은 불가능하다존재하다모든 라인.