正则表达式 字符串 数字 bash

正则表达式 字符串 数字 bash

我有这种情况:

$FILE_NAME = '207.Skyfall.2012.iTA-ENG.Bluray.1080p.x264.mkv'
echo $FILE_NAME | sed 's/.[0-9].*//' | sed 's/\./ /g'

Result empty the regex remove all

如果文件不是以数字开头那么一切正常。

$FILE_NAME = 'Skyfall.2012.iTA-ENG.Bluray.1080p.x264.mkv'

Result: Skyfall

我需要它自动推断电影名称并删除年份之后的所有其他内容

可以帮忙修复这个问题吗?

答案1

在第一个例子中,.[0-9].*匹配任何字符,然后匹配数字,然后匹配任何内容,因此它匹配整行并将其替换为任何内容。

在第二个例子中,它不匹配Skyfall,它匹配第一个点和一个数字(即2)以及之后的所有内容,因此从数字之前的字符到行尾的所有内容都被替换为任何内容。

你应该使用:

s/\.[0-9]\+.*$//

这将删除第一个点,后跟 1 个或多个数字,以及其后的所有内容。

答案2

这应该有效:

s/[0123456789.]*([^.]*).*/\1/

例子:

# echo $FILE_NAME | sed -E 's/[0123456789.]*([^.]*).*/\1/'
Skyfall

相关内容