保持sed正则表达式匹配的第一个字符

时间:2015-11-25 00:02:03

标签: regex bash perl sed rename

我正在尝试在Debian中使用rename perl命令重命名文件并从文件名末尾删除碎片。

文件名可能如下(系列/剧集标识符之前的长度/节点不同)

A.TV.Show.S01E01.HDTV.XVid[stuff].avi
Other.Prog.S07E09.WEB.H264[things].mp4

我想删除SnnEnn位之后的所有内容并保留文件扩展名。例如

A.TV.Show.S01E01.avi
Other.Prog.S07E09.mp4

我不介意每个文件扩展名都有一个命令,尽管扩展名不可知的单个命令会更好。

到目前为止我所拥有的内容如下:

rename -nv -- 's/[0-9][.].*?[.]avi$/.avi/' *.avi

我刚刚使用-n所以它只显示重命名会做什么,而不会这样做。

问题是它在系列和剧集标识符的末尾丢失了数字 - 我需要它来保留匹配文本的第一个字符然后将其余部分抛弃。

它目前给我的是这样命名的文件:

A.TV.Show.S01E0.avi
Other.Prog.S07E0.mp4

知道怎么做吗?是否有比我使用的更好的模式?

2 个答案:

答案 0 :(得分:1)

这应该有效。它捕获您想要保留在括号中的部分,然后在替换中将其称为$1

rename -nv -- 's/(^.*?S\d{2}E\d{2})\..*?\.(*)$/$1.$2/' *

答案 1 :(得分:0)

您需要使用括号来捕获部分字符串:

s/([0-9])[.].*?[.]([^.]+)$/$1.$2/

或者,你可以使用后视而不是第一次捕捉:

s/(?<=[0-9])[.].*?[.]([^.]+)$/.$1/