通过在正则表达式模式的最后一个字符之前插入引号来批量重命名文件

问题描述 投票:0回答:2

01 - 情况

假设我有数百个这样的文件: (不关心文件类型)

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

02 - 我做了什么

我首先访问“regexr.com”来编写我的命令。 我已将我的模式与此表达式相匹配:

 (( - )(\w+))(?=(s))

这是截图

替换对我来说似乎很简单:

$1'

仍然在“regexr.com”上,我得到了我想要的:

屏幕截图#2:

最后我在测试文件夹中执行了命令,这再次看起来非常基本。

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

谁能告诉我发生了什么事或者我是否犯了错误?

感谢您的见解... 马丁

bash rename batch-processing
2个回答
1
投票
双引号内的

$1
将被扩展(可能什么都没有),因此您的重命名模式实际上是
s/(( - )(\w+))(?=(s))/'/gi
- 换句话说,您实际上并没有保留捕获组。

您需要添加转义符来防止这种扩展:

rename -vf "s/(( - )(\w+))(?=(s))/\$1'/gi" *


0
投票

这个简化的正则表达式更具可读性:

rename -v -f "s/( - \w+)(?=s)/\$1'/gi" *
© www.soinside.com 2019 - 2024. All rights reserved.