탐욕스럽지 않은 grep

탐욕스럽지 않은 grep

외부 파일의 링크를 grep하고 싶습니다 example.txt.

example.txt포함하다:

(https://example.com/pathto/music.mp3)music.mp3

암호:

egrep -o -m1 '(https)[^'\"]+.mp3' example.txt

산출:

https://example.com/pathto/music1.mp3)music.mp3

grep을 실행하면 마지막 .mp3가 출력의 끝으로 감지되는 반면, 첫 번째 발생 이후에만 끝나야 합니다. 첫 번째 패턴을 찾은 후 grep에게 중지하도록 어떻게 지시합니까?

내가 원하는 출력:

https://example.com/pathto/music.mp3

다음으로 https시작하고 끝나는 문자열을 추출하고 싶습니다.mp3

답변1

?표준 grep은 일반적으로 탐욕스럽지 않게 만드는 수정자를 허용하지 않습니다 .

그러나 배포판에서 활성화된 경우 -P 옵션을 사용하면 Perl 스타일 정규식을 허용하게 됩니다.

grep -oP -m1 "(https)[^'\"]+?.mp3" mp3.txt

그래도 작동하지 않으면 특정 예의 범위에 올바른 대괄호를 포함하여 대괄호 밖으로 나가지 않도록 할 수 있습니다.

egrep -o -m1 "(https)[^'\")]+?.mp3" mp3.txt

답변2

egrep은 탐욕스럽지 않은 일치를 지원하지 않습니다. Perl 모드를 사용하면 -P다음과 같은 이점이 있습니다.

grep -o -m1 -P  'https.*?mp3' example.txt

답변3

~$ cat example.txt
(https://example.com/pathto/music.mp3)music.mp3

~$ grep -Po "(https)[^'\"].*?mp3" example.txt
https://example.com/pathto/music.mp3

관련 정보