grep não-ganancioso

3

Eu quero chamar um link de um arquivo externo example.txt .

example.txt containins:

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

o código:

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

saída:

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

Quando executo o grep, ele detecta o último .mp3 como o final da saída, enquanto eu preciso que ele termine após a primeira ocorrência. Como posso dizer ao grep para parar depois de encontrar o primeiro padrão?

Minha saída desejada:

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

Eu só quero extrair qualquer string começando com https e terminando com mp3

    
por Woeitg 05.03.2016 / 13:59

3 respostas

3

O grep padrão não aceita o modificador ? que normalmente o tornaria não-ganancioso.

Mas você pode tentar a opção -P que, se ativada na sua distro, fará com que ela aceite as expressões regulares do estilo Perl:

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

Se isso não funcionar, você pode incluir, no seu exemplo específico, o parêntese correto no intervalo, para que ele não pareça além dos parênteses:

egrep -o -m1 "(https)[^'\")]+?.mp3" mp3.txt
    
por 05.03.2016 / 14:40
3

O egrep não suporta correspondência não-gulosa. Usando o modo perl -P irá ajudá-lo:

grep -o -m1 -P  'https.*?mp3' example.txt
    
por 05.03.2016 / 14:29
1
~$ cat example.txt
(https://example.com/pathto/music.mp3)music.mp3

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

Tags