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的-replaceoperator(... -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逃脱文字'...'的替换字符串,用下面的习惯使用一个变量,你要使用其值从字面上:
$ ` 方法.
另外,在简单的情况下,此方法是一种替代方法,但请注意,默认情况下它是区分大小写的."..."`调用,但由于需要转义,语法很棘手:$