非贪婪 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

相关内容