我想重命名具有以下格式的文件:
somethingblabla15T06:58_31+0000somethingblabla.bla
新名称应该是
somethingblabla15T06:58:31+0000somethingblabla.bla
因此_
数字内的 应替换为:
。
我想使用基于 perl 的重命名命令行工具来执行此操作。
我认为这将是正则表达式的一部分:
's/[0-9](_)[0-9]/:'
我无法让它工作。我认为这也应该被转义或类似操作。
答案1
尝试:
rename 's/([0-9])_([0-9])/$1:$2/'
例子
考虑包含此文件的目录:
$ ls som*
somethingblabla15T06:58_31+0000somethingblabla.bla
让我们运行rename
然后ls
再次运行:
$ rename 's/([0-9])_([0-9])/$1:$2/' s*
$ ls som*
somethingblabla15T06:58:31+0000somethingblabla.bla
怎么运行的
([0-9])_([0-9])
匹配一个数字,后跟一个下划线,后跟一个数字。由于括号,每个数字都保存在一个组中。替换文本是指向第一个保存的组和第二个保存的组的$1:$2
位置。$1
$2
答案2
不使用捕获组来完成工作的另一种方法:
rename 's/(?<=\d)_(?=\d)/:/' something*
解释:
s/ # substitute
(?<=\d) # positive lookbehind, make sure we have a digit before
_ # underscore
(?=\d) # positive lookahead, make sure we have a digit after
/ # with
: # colon
/ # end subst.