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

Sam*_*IAm 2 regex unix grep

对于字符串说:

test.1234.mp4 
Run Code Online (Sandbox Code Playgroud)

我想提取数字1234而不提取mp4中的4

正则表达式会是什么?

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

更多例子:

test.abc.1234.mp4
test.456.abc.mp4
test.aaa.bbb.c.111.mp4
test.e666.123.mp4
Run Code Online (Sandbox Code Playgroud)

基本上只提取数字.因此,对于最后一个例子,来自e666的666不会被提取,只有123.要提取我一直在使用

echo "example.123.mp4" | grep -o "REGEX"
Run Code Online (Sandbox Code Playgroud)

编辑:test456本来是test.456

fed*_*qui 5

cut 可以做到:

$ echo "test.1234.mp4" | cut -d. -f2
1234
Run Code Online (Sandbox Code Playgroud)

哪里

cut   -d'.'        -f2
      delimiter    2nd field
Run Code Online (Sandbox Code Playgroud)

如果您提供更多示例,我们可以改进输出.在当前的代码,你会提取任何somethingblablabla.something.blablabla.


更新:从您的问题更新我们可以这样做:

grep -o '\.[0-9]*\.' | sed 's/\.//g'
Run Code Online (Sandbox Code Playgroud)

测试:

$ 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
Run Code Online (Sandbox Code Playgroud)


Joh*_*erg 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
Run Code Online (Sandbox Code Playgroud)

请注意,这只会打印第一组数字,如果我们有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
Run Code Online (Sandbox Code Playgroud)

第一场比赛是线的开头(^)或点,后跟数字和点.我们在这里使用$ 2,因为$ 1是一行或一个点的开头.