批量重命名文件正则匹配异常求助:rename命令结果不符预期
文件批量重命名正则替换异常问题
原始文件名格式:
Steven Scott - Stevens Dinner With Sandy.txt Matt Lang - Matts First Song.txt Martin Julien - Martins First Trip to Paris.txt
期望重命名后:
Steven Scott - Steven's Dinner With Sandy.txt Matt Lang - Matt's First Song.txt Martin Julien - Martin's First Trip to Paris.txt
你在regex测试工具中用正则(( - )(\w+))(?=(s)),替换为$1'能得到正确结果,但执行命令:
rename -vf "s/(( - )(\w+))(?=(s))/$1'/gi" *
后,得到错误结果:
Martin Julien's First Trip to Paris.txt Matt Lang's First Song.txt Steven Scott's Dinner With Sandy.txt
原因与解决办法
问题出在shell的引号解析:你用双引号包裹替换表达式时,shell会把$1当作自身的位置参数(当前无参数时为空),导致实际传给rename的替换规则变成了s/(( - )(\w+))(?=(s))/'/gi——直接把匹配到的 - XXX替换成了单引号,最终出现文件名里-消失、直接加's的错误。
解决方法很简单,把整个替换表达式用单引号括起来,避免shell解析正则的反向引用$1,同时注意单引号的转义:
rename -vf 's/(( - )(\w+))(?=(s))/$1\'/gi' *
也可以简化正则写法,让逻辑更清晰:
rename -vf 's/ - (\w+)(?=s)/ - $1\'/gi' *
执行上述命令后,就能得到你预期的重命名结果。
内容的提问来源于stack exchange,提问作者Martin Julien
相关产品推荐
相关产品推荐

