如何在批量重命名中使用正则表达式匹配组?
How to use regular expression matching groups in batch renames?
我正在尝试使用 PowerShell 进行一些基于正则表达式的批量重命名。
这成功地只提供了我需要的文件:
Get-ChildItem . | Where-Object { $_.Name -cmatch "(\b|_)(L|H|M|X{1,3})(_|\b)" }
(所有包含大写字母 L、M、X、...)
接下来,我想重命名,即 mycustom_M.png
到 processed_M.png
,another_L.png
到 processed_L.png
,等等。
基本上,如果我在 Notepad++ 中,我会使用正则表达式 .*?(?:\b|_)(L|H|M|X{1,3})(?:_|\b).*
来 select 名称,并使用 processed_.png
来替换它们,但我无法让它工作在 PowerShell 中(我肯定在这里错过了正确的语法):
[...] | Rename-Item -NewName { $_.Name -replace ".*?(?:\b|_)(L|H|M|X{1,3})(?:_|\b).*","banner_$Matches.groups[1].value" }
PowerShell 中的反向引用以 $
开头,而不是 \
。但是,您必须将替换表达式放在单引号中或转义 $
,否则 PowerShell 会将 </code> 扩展为常规变量:</p>
<pre><code>$pattern = ".*?(?:\b|_)(L|H|M|X{1,3})(?:_|\b).*"
... | Rename-Item -NewName { $_.Name -replace $pattern, 'banner_' }
或
$pattern = ".*?(?:\b|_)(L|H|M|X{1,3})(?:_|\b).*"
... | Rename-Item -NewName { $_.Name -replace $pattern, "banner_`" }
我正在尝试使用 PowerShell 进行一些基于正则表达式的批量重命名。
这成功地只提供了我需要的文件:
Get-ChildItem . | Where-Object { $_.Name -cmatch "(\b|_)(L|H|M|X{1,3})(_|\b)" }
(所有包含大写字母 L、M、X、...)
接下来,我想重命名,即 mycustom_M.png
到 processed_M.png
,another_L.png
到 processed_L.png
,等等。
基本上,如果我在 Notepad++ 中,我会使用正则表达式 .*?(?:\b|_)(L|H|M|X{1,3})(?:_|\b).*
来 select 名称,并使用 processed_.png
来替换它们,但我无法让它工作在 PowerShell 中(我肯定在这里错过了正确的语法):
[...] | Rename-Item -NewName { $_.Name -replace ".*?(?:\b|_)(L|H|M|X{1,3})(?:_|\b).*","banner_$Matches.groups[1].value" }
PowerShell 中的反向引用以 $
开头,而不是 \
。但是,您必须将替换表达式放在单引号中或转义 $
,否则 PowerShell 会将 </code> 扩展为常规变量:</p>
<pre><code>$pattern = ".*?(?:\b|_)(L|H|M|X{1,3})(?:_|\b).*"
... | Rename-Item -NewName { $_.Name -replace $pattern, 'banner_' }
或
$pattern = ".*?(?:\b|_)(L|H|M|X{1,3})(?:_|\b).*"
... | Rename-Item -NewName { $_.Name -replace $pattern, "banner_`" }