非贪婪的grep

Woe*_*itg 9 grep

我想从外部文件 grep 链接example.txt

example.txt 包含:

(https://example.com/pathto/music.mp3)music.mp3
Run Code Online (Sandbox Code Playgroud)

编码:

egrep -o -m1 '(https)[^'\"]+.mp3' example.txt
Run Code Online (Sandbox Code Playgroud)

输出:

https://example.com/pathto/music1.mp3)music.mp3
Run Code Online (Sandbox Code Playgroud)

当我运行 grep 时,它将最后一个 .mp3 检测为输出结束,而我只需要它在第一次出现后结束。如何在找到第一个模式后告诉 grep 停止?

我想要的输出:

https://example.com/pathto/music.mp3
Run Code Online (Sandbox Code Playgroud)

我只想提取以开头https和结尾的任何字符串mp3

mar*_*lar 7

标准 grep 不接受?通常会使其成为非贪婪的修饰符。

但是您可以尝试 -P 选项 - 如果在您的发行版中启用 - 将使其接受 Perl 样式的正则表达式:

grep -oP -m1 "(https)[^'\"]+?.mp3" mp3.txt
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,您可以为您的特定示例在范围内包含正确的括号,这样它就不会超出括号:

egrep -o -m1 "(https)[^'\")]+?.mp3" mp3.txt
Run Code Online (Sandbox Code Playgroud)


MAQ*_*MAQ 6

egrep 不支持非贪婪匹配。使用 perl 模式-P将帮助您:

grep -o -m1 -P  'https.*?mp3' example.txt
Run Code Online (Sandbox Code Playgroud)