regex - 使用正则表达式提取子字符串同时排除某个短语

标签 regex unix grep

对于字符串说:

test.1234.mp4 

我想提取数字 1234 没有提取mp4中的4

这个正则表达式是什么?

数字并不总是位于第二个位置,可以位于不同的位置并且可能不总是四位数。我想提取数字而不提取 mp4 中的 4。

更多例子:

test.abc.1234.mp4
test.456.abc.mp4
test.aaa.bbb.c.111.mp4
test.e666.123.mp4

基本上只会提取数字。因此,对于最后一个示例,e666 中的 666 不会被提取,而只有 123。 提取我一直在使用

echo "example.123.mp4" | grep -o "REGEX"

编辑:test456 本来就是 ​​test.456

最佳答案

接受的答案将在“test.e666.123.mp4”(打印 666)上失败。

这应该可行

$ cat | perl -ne '/\.(\d+)\./; print "$1\n"'
test.abc.1234.mp4
test.456.abc.mp4
test.aaa.bbb.c.111.mp4
test.e666.123.mp4
1234
456
111
123

请注意,这只会打印第一组数字,如果我们有 test.123.456.mp4,则只会打印 123。

我们的想法是匹配一个点后跟我们感兴趣的数字(括号保存匹配),然后是另一个点。这意味着它将在 123.mp4 上失败。

要解决此问题,您可以:

$ cat | perl -ne '/(^|\.)(\d+)\./; print "$2\n"'
test.abc.1234.mp4
test.456.abc.mp4
test.aaa.bbb.c.111.mp4
test.e666.123.mp4
781.test.mp4
1234
456
111
123
781

第一个匹配项是行首 (^) 或一个点,后跟数字和一个点。我们在这里使用 $2,因为 $1 要么是一行的开头,要么是一个点。

关于regex - 使用正则表达式提取子字符串同时排除某个短语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16478118/

相关文章:

javascript - 匹配倒数第二个和最后一个反斜杠字符之间的所有内容

javascript - 使用javascript转换以分号分隔的字符串

c - 为什么在我的主函数的任何部分运行之前我会遇到段错误(核心转储)

linux - 在多个文件中搜索多个模式

javascript - 使用一个 JavaScript 正则表达式捕获四个数字

c# - 如果给定模式,是否有可以生成随机正则表达式字符串的类?

c - 有什么方法可以区分规范模式下的 EOL 和 EOF 吗?

shell - UNIX 时间命令 - 输入时间是否被考虑在内?

linux - Impty grep 导致循环

linux - Grep资源使用