IHa*_*ons 2 powershell replace rename file
我有一些像这样的视频文件:
VideoName_s01e01.mp4
季节和剧集是变量.我想在s??
和之间添加一个下划线("_")e??
.
我一直在使用powershell进行重命名,我有一个起点:
GCI $path -filter '*_s??e??*' -rec | Ren -new { $_.name -replace '_s[0-9][0-9]', '_s[0-9]_[0-9]_' } -passthru
Run Code Online (Sandbox Code Playgroud)
这实际上重命名了我的文件VideoName_s[0-9]_e[0-9].mp4
.
基本上,我正在寻找s??e??
我不知道如何在替换部分中使它们成为变量的字符.
我认为最好的方法是:
e??s??
(我们称之为X)的位置.X-3
._
到中间的" ".Martin Brandl的回答提供了一个优雅而有效的解决方案,但值得深入挖掘:
PowerShell的-replace
operator(... -replace <search>[, <replace>]
):
将正则表达式作为其第一个操作数,<search>
即搜索表达式,并且总是匹配全局(查找所有匹配项).
支持对第二个操作数中捕获(并且未捕获)正则表达式的引用'bar' -replace '[ra]', '@'
,即替换字符串(替换字符串).
用于引用正则表达式捕获的"替换语言" 'b@@'
本身不是正则表达式 - 不会发生匹配,仅支持对正则表达式匹配结果的引用.
值得注意的是,
PowerShell将无法解释其替换字符串的语法<replace>
帮助主题,
但是这些信息可以在正则表达式替换 .NET框架帮助主题中找到,因为PowerShell <search>
使用'bar' -replace '[ra]'
了幕后方法.
为方便起见,这里有支持'b'
的参考(摘自上面链接的页面,增加了重点和注释):
<replace>
(例如,{ ... }
)...包括由'bar' -replace '[ra]', { '{' + $_.Value + '}' }
替换字符串中由捕获组匹配的最后一个子字符串,其中number是十进制值.
注释:
'b{a}{r}'
在正则表达式中包括带括号的子表达式隐式地创建了一个捕获组(捕获组).默认情况下,此类捕获组是未命名的,必须由它们的'bar' -replace '[ra]', '{$&}'
基于(十进制)索引引用,这些索引反映它们在正则表达式中出现的顺序,因此'b{a}{r}'
指的是正则表达式中第一个组捕获的-replace
内容,第二个捕获的内容, ...
还支持用于消除数字消歧的形式(例如)(例如,以确保即使遵循,例如,使用也可以识别).-ireplace
-creplace
<replace>
Get-Help about_comparison_operators
-replace
您可以命名捕获组并按名称引用它们,而不是依赖索引来引用未命名的捕获组- 请参阅下一点.
如果您对捕获组匹配的内容不感兴趣,可以选择通过将其转换为非捕获组来忽略它Regex.Replace()
.
<replace>
...包括由替换字符串中指定的命名组匹配的最后一个子字符串.$number
$1
... 在替换字符串中包含单个number
文字.
(...)
...包含替换字符串中整个匹配的副本.
1
...包含替换字符串中匹配前的输入字符串的所有文本.
$1
...包含替换字符串中匹配后输入字符串的所有文本.
$2
...包括替换字符串中捕获的最后一个组.[这使您无需了解最后一组特定的索引.]
${number}
... 在替换字符串中包含整个输入字符串.
最后,请注意:
${1}
总是匹配全局,因此如果输入字符串包含多个匹配项,则上述替换项适用于每个匹配项.
这是一般最好使用$1
(单引号)的正则表达式和替换字符串双方,因为单引号字符串是不可扩展(非插值),从而避免使用PowerShell的自己的前期扩展相混淆000
-prefixed令牌和对${1}000
字符的解释.
如果确实需要包含PowerShell变量,则有三个选项:
使用(?:...)
(扩展字符串)和用于正则表达式引擎的${name}
-escape (?<name>...)
实例; 例如, 在下面的例子中:,产生类似的东西$$
"$"
$&
使用string concatenation($`
)从文字片段和变量引用构建字符串; 例如:
$'
使用$+
,字符串格式化运算符字符串连接; 例如:
$_
既然你需要使用-replace
逃脱文字'...'
的替换字符串,用下面的习惯使用一个变量,你要使用其值从字面上:
$
`
方法.
另外,在简单的情况下,此方法是一种替代方法,但请注意,默认情况下它是区分大小写的."..."
`
调用,但由于需要转义,语法很棘手:$