I want to grep a link from an external file example.txt.

example.txt containins:


the code:

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



When I run grep, it detect the last .mp3 as end of output while I just need it end after first occurrence. How can I tell grep to stop after finding the first pattern?

My desired output:


I just want to extract any string starting with https and ending with mp3

  • 1
    the + operator in grep is greedfy; you want a non-greedy match... – Jeff Schaller Mar 5 '16 at 13:03
  • no, I dont care about (and ). I just want to extract any string starting with https and ending with mp3 – Woeitg Mar 5 '16 at 13:14
  • in my data after the links there are name of the files.it is not immediately after but it is somewhere in text. – Woeitg Mar 5 '16 at 13:18
  • @JeffSchaller I read the documentation. but i didn't understand what is non-greedy version of + . For instance ?+ or {1} also result in the same. Can you please tell me what is the non-greedy equivalent of + ? gexperts.org/tour/index.html?grep_regular_expressions.html – Woeitg Mar 5 '16 at 13:20
  • I read your regexp a little too quickly; your [] is telling grep to grab everything that's not a single- or double-quote. Does a ) always end your desired filename? [^)] would work in that case. – Jeff Schaller Mar 5 '16 at 13:40

Standard grep does not accept the ? modifier that would normally make it non-greedy.

But you can try the -P option that - if enabled in your distro - will make it accept Perl style regexes:

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

If that does not work, you could for your specific example include the right parenthesis in the range so it wouldn't look beyond the parenthesis:

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

egrep does not support non-greedy matching. Using perl mode -P will help you:

grep -o -m1 -P  'https.*?mp3' example.txt
| improve this answer | |
~$ cat example.txt

~$ grep -Po "(https)[^'\"].*?mp3" example.txt
| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.