sed 정규식 패턴이 욕심쟁이와 일치하면 안 되지만 일치함

sed 정규식 패턴이 욕심쟁이와 일치하면 안 되지만 일치함

설명할 수 없는 행동을 우연히 발견했습니다. 여러분 중 일부가 저를 도와주실 수 있기를 바랍니다.

나는 더 큰 프로젝트에서 일종의 문서를 생성하려고 합니다 Ant. 따라서 sed나중에 문서에 필요한 파일의 정보를 필터링하는 데 사용합니다.

다음과 같은 줄이 포함된 일반 개미 빌드 파일이 있습니다.

    <target name="targetA" depends="targetD" description="some fancy description">
...
    <target name="targetB" depends="targetD" description="some fancy description">
...
    <target name="targetC" depends="targetD" description="some fancy description">

이제 다음 sed 라인을 따라 실행합니다.

sed -nr 's/.*?target name="(.*?)".*="(.*?)".*/ * \1 - \2/p'

그것은 나에게 다음을 제공해야 합니다:

 * targetA - some fancy description
 * targetB - some fancy description
 * targetC - some fancy description

대신 나는 다음을 얻습니다.

 * targetA" depends="targetD" - some fancy description
 * targetA" depends="targetD" - some fancy description
 * targetA" depends="targetD" - some fancy description

정규식을 다음 큰따옴표까지 탐욕스럽지 않게 설정했지만, 전체 "의존" 부분과 실제로 일치하는 첫 번째 그룹인지 확인하기 위해 두 번째 그룹의 출력을 건너뛰려고 했습니다.

내가 여기서 무엇을 놓치고 있는 걸까요?

이와 같이 더 명시적인 정규식을 사용하면 예상대로 작동하지만 여전히 탐욕스러운 것을 얻지 못합니다.

sed -nr 's/.*?target name="(.*?)".*=.*="(.*?)".*/ * \1 - \2/p'

이것이 흥미로울 수 있으므로 우분투 리눅스에서 sed-4.2.2-4ubuntu1을 사용하고 있습니다 (기본 설치)

답변1

Sed는 ".*?"에서 볼 수 있듯이 탐욕스럽지 않은 일치를 지원하지 않습니다. 표현.

이 시도:

sed -nr 's/.*target name="([^"]*)" .*="(.*)".*/ * \1 - \2/p' file

산출:

* targetA - 멋진 설명
 * targetB - 멋진 설명
 * targetC - 멋진 설명

관련 정보