설명할 수 없는 행동을 우연히 발견했습니다. 여러분 중 일부가 저를 도와주실 수 있기를 바랍니다.
나는 더 큰 프로젝트에서 일종의 문서를 생성하려고 합니다 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 - 멋진 설명