Regex PowerShell替换语法:正则表达式替换和环境变量
我试图替换regex和环境变量,但找不到正确的语法(因为单引号和双引号不匹配)。我正在开发的短脚本将重命名文件。下面是我的设置看起来像我尝试的一些方法Regex PowerShell替换语法:正则表达式替换和环境变量,regex,powershell,replace,Regex,Powershell,Replace,我试图替换regex和环境变量,但找不到正确的语法(因为单引号和双引号不匹配)。我正在开发的短脚本将重命名文件。下面是我的设置看起来像我尝试的一些方法 # Original File Name: (BRP-01-001-06K48b-SC-CC-01).tif # Desired File Name: (BRP-12-345-06K48b-SC-CC-01).tif # Variables defined by user: PS ..\user> $pic,$change="
# Original File Name: (BRP-01-001-06K48b-SC-CC-01).tif
# Desired File Name: (BRP-12-345-06K48b-SC-CC-01).tif
# Variables defined by user:
PS ..\user> $pic,$change="01-001","12-345"
# The problem is with the "-replace" near the end of the command
PS ..\user> get-childitem .\* -recurse | where-object {$_.BaseName -match ".*\(BRP-$pic-.{15}\).*"} | foreach-object {$orig=($_.FullName); $new=($orig -replace "(\(BRP-)($pic)(-.{15}\))", '$1$change$3'); echo $new}
PS ..\user> (BRP-$change-06K48b-SC-CC-01).tif
# Also tried:
PS ..\user> get-childitem .\* -recurse | where-object {$_.BaseName -match ".*\(BRP-$pic-.{15}\).*"} | foreach-object {$orig=($_.FullName); $new=($orig -replace "(\(BRP-)($pic)(-.{15}\))", "`$1$change`$3"); echo $new}
PS ..\user> $112-345-06K48b-SC-CC-01).tif
# If I put a space before $change:
PS ..\user> get-childitem .\* -recurse | where-object {$_.BaseName -match ".*\(BRP-$pic-.{15}\).*"} | foreach-object {$orig=($_.FullName); $new=($orig -replace "(\(BRP-)($pic)(-.{15}\))", "`$1 $change`$3"); echo $new}
PS ..\user> (BRP- 12-345-06K48b-SC-CC-01).tif
在上一个示例中,如果我在$change之前添加空格,它将“起作用”。。。但是我不想要空间。我意识到我可以做另一个replace
操作来修复空间,但如果可能的话,我想在一个命令中完成这一切
使用环境变量和正则表达式替换需要替换什么语法
此外,出于好奇,一旦工作,它将替换文件名中的所有事件或仅第一个事件。例如,文件是否会:
"Text (BRP-01-001-06K48b-SC-CC-01) Text (BRP-01-001-06K48b-SC-OR-01)"
改为:
"Text (BRP-12-345-06K48b-SC-CC-01) Text (BRP-12-345-06K48b-SC-OR-01)"
或者只进行第一次匹配,如:
"Text (BRP-12-345-06K48b-SC-CC-01) Text (BRP-01-001-06K48b-SC-OR-01)"
下面可能是你想要的
$pic = "01-001"
$change = "12-345"
$RenameFiles_FilterStr = "*BRP-$pic*.tif"
gci $RenameFiles_FilterStr -recurse | % { $_.BaseName -replace $pic,$change }
# The above returns renamed strings (files not renamed yet). If the expected result matches the returned ones, then uncomment the below and run to rename the files
# gci $RenameFiles_FilterStr -recurse | % { Rename-Item -NewName ($_.BaseName -replace $pic,$change) }
最佳做法是在
{}
中使用捕获组名称,或者在替换字符串中使用命名的捕获组。在第二个示例中使用{}
,应该可以很好地解决问题
"Text (BRP-01-001-06K48b-SC-CC-01) Text (BRP-01-001-06K48b-SC-OR-01)" -replace "(\(BRP-)($pic)(-.{15}\))", "`${1}$change`${3}"
当PowerShell变量、捕获组和字符串文字位于替换字符串中时,不能使用周围的单引号。使用周围的双引号可以进行内部扩展。因此,您需要勾选用于标识捕获组的escape$
第二个示例通常具有正确的语法,但由于$change
以数字开头,因此会产生意外后果。您正在替换字符串中转义$
,以使用捕获组1
和3
。由于$change
的计算结果为12-345
,因此预期的捕获组1
实际上是捕获组112
,它不存在。有关第二次尝试的说明,请参见下文:
“(\(BRP-)($pic)(.15}\)”
:
- 捕获组1:
(BRP-
- 捕获组2:
01-001
- 捕获组3:
-06K48b-SC-CC-01)
“`1$change`$3”
在运行时变成$112-345$3
,然后变成$112-345-06K48b-SC-CC-01)
。请注意,$112
已在替换捕获组之前插入。然后检查捕获组112
。由于它不存在,$112
被假定为一个字符串。这是否回答了您的问题?感谢您的解答和解释;这正是我需要学习的。谢谢你。虽然我正在处理的实际问题更加复杂,需要正则表达式替换的灵活性,但我非常喜欢您提供的简明解决方案(因为它解决了我提出的问题)。曾经有很多次,我可以使用像您这样的简单解决方案,我预计在我当前项目之外的将来,我会经常使用它。它的简洁真的很优雅