2

对字符串说:

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

4

6 回答 6

5

接受的答案将在“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 要么是行的开头,要么是一个点。

于 2013-05-10T09:32:56.253 回答
5

cut可以做到:

$ echo "test.1234.mp4" | cut -d. -f2
1234

在哪里

cut   -d'.'        -f2
      delimiter    2nd field

如果您提供更多示例,我们可以改进输出。使用当前代码,您可以somethingblablabla.something.blablabla.


更新:根据您的问题更新,我们可以这样做:

grep -o '\.[0-9]*\.' | sed 's/\.//g'

测试:

$ echo "test.abc.1234.mp4
test456.abc.mp4
test.aaa.bbb.c.111.mp4
test.e666.123.mp4" | grep -o '\.[0-9]*\.' | sed 's/\.//g'
1234
111
123
于 2013-05-10T08:35:07.460 回答
1
echo "test.1234.mp4" | perl -lpe 's/[^.\d]+\d*//g;s/\D*(\d+).*/$1/'

或者:

echo "1321.test.mp4" | perl -lpe 's/.*(?:^|\.)(\d+)\..*/$1/'

p是默认打印,这样我们就不需要显式了printe说我们有一个表达式,而不是脚本文件 l放入换行符

如果您在名称的第一部分有一个数字,这些也将起作用。

于 2013-05-10T08:51:49.960 回答
1
grep -Po "(?<=\.)\d+(?=\.)"
于 2013-05-10T08:48:10.333 回答
0
perl -F'\.' -lane 'print "$F[scalar(@F)-2]" if(/\d+\.mp4$/)' your_file

测试:

> perl -F'\.' -lane 'print "$F[scalar(@F)-2]" if(/\d+\.mp4$/)' temp
1234
111
123
于 2013-05-10T08:51:32.917 回答
0
$ cat file
test.abc.1234.mp4
test.456.abc.mp4
test.aaa.bbb.c.111.mp4
test.e666.123.mp4

$ sed 's/.*\.\([0-9][0-9]*\)\..*/\1/' file
1234
456
111
123
于 2013-05-11T04:38:46.003 回答