请耐心等待,这篇文章会有点长......
我有一堆文件,其中一些文件名称简洁明了(例如1E01.txt),还有一些文件有很多额外内容:
Sample2_Name_E01_-co_032.txt
Sample2_Name_E02_-co_035.txt
...
Sample12_Name_E01_-co_061.txt
等等。这里重要的是“Sample”之后的数字和“ Name ”之后的字母+数字 - 其余的是一次性的。如果我摆脱了不重要的部分,文件名将减少到与“干净”文件名(2E01.txt,2E02.txt,...,12E01.txt)相同的模式。我已经设法用以下表达式重命名文件(我自己想出这个文件,不知道它是否非常优雅但工作正常):
rename -v 's/Sample([0-9]+)_Name_([A-Z][0-9]+).*/$1$2\.txt/' *.txt
现在,第二部分是为只有一位数的文件名添加前导零,例如1E01.txt变为01E01.txt。我已经成功了(在另一个StackExchange帖子上找到并修改了这个):
rename -v 'unless (/^[0-9]{2}.*\.txt/) {s/^([0-9]{1}.*\.txt)$/0$1/;s/0*([0-9]{2}\..*)/$1/}' *.txt
所以我终于得到了一个问题:有没有办法在一个重命名命令中合并两个表达式?我知道我可以做一个bash脚本来自动化这个过程,但我想要的是找到一个通过重命名的解决方案。
感谢
答案 0 :(得分:10)
您可以尝试使用此命令将1-file.txt
重命名为0001-file.txt
# fill zeros
$ rename 's/\d+/sprintf("%04d",$&)/e' *.txt
您可以稍微更改命令以满足您的需要。
答案 1 :(得分:1)
如果这是你的“解析”正则表达式,那么你正在限制脚本可以对匹配该模式的文件执行的文件。因此,sprintf
使用相同的文字字符串不是更专业的情况,你可以这样做:
s{Sample(\d+)_Name_(\p{IsUpper})(\d+)}
{sprintf "Sample%02d_Name_%s%03d", $1, $2, $3}e
;
在这里,您再次使用相同的已知功能,只需格式化随附的数字。
/e
switch用于'eval',它会为每次匹配评估替换为Perl。 [A-Z]
成为属性类\p{IsUpper}
,[0-9]
成为数字代码\d
(也可能\p{IsDigit}
1}})。