对于字符串说:
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
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)
如果您提供更多示例,我们可以改进输出.在当前的代码,你会提取任何something在blablabla.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)
接受的答案将在"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是一行或一个点的开头.