2016-11-18 61 views
2

我有幾個像這樣的視頻文件: VideoName_s01e01.mp4其中季節和劇集是變量。我想在s??e??之間添加下劃線(「_」)。通過重新格式化現有文件名重命名文件 - 與替換字符串一起使用的替換字符串中的佔位符

我一直在使用重命名的目的,我有一個起點:

GCI $path -filter '*_s??e??*' -rec | Ren -new { $_.name -replace '_s[0-9][0-9]', '_s[0-9]_[0-9]_' } -passthru  

這實際上改名爲我的文件VideoName_s[0-9]_e[0-9].mp4

基本上,我正在尋找字符s??e??我只是不知道如何使它們在替換部分的變量。

我認爲最好的方法是:

  1. 找到e??s??位置(我們稱之爲X)。
  2. 將字符串拆分爲X-3
  3. 將字符串與中間的「_」連接起來。

回答

4

Martin Brandl's answer provides an elegant and effective solution,但它是值得深入探討:

PowerShell的-replace運營商(... -replace <search>, <replace>):

  • 需要正則表達式作爲其第一個操作數,<search>,搜索表達式),並且總是相匹配全局(發現所有匹配)。

  • 支持引用第2個操作數<replace>中替換字符串(替換字符串)的正則表達式捕獲(並未捕獲)的內容。

的「替代語言」來引用在<replace>支持正則表達式捕獲本身正則表達式 - 沒有匹配的情況還有,只對正則表達式匹配的結果引用的支持。

值得注意的是,

爲了方便起見,這裏有引用在<replace>支持(從上面的鏈接頁面摘錄,重點和註釋添加):

  • $number(例如,$1)...包括捕獲組所匹配的最後一個子字符串,它由number標識,其中number是替換字符串中的十進制值。

    • 註解

      • ,包括你的正則表達式一個對子表達式(...)暗中創建一個無名捕捉(捕獲)組。無名組由指數,開始1引用,使$1指的是什麼在你的正則表達式的第一個未命名的組捕獲,$2到第二捕獲什麼,...
        因此,那些與馬丁的回答第一([0-9]{1,2}),擷取後的s,反映在$1以及e之後的第二個未命名組,$2

      • 形式${number}(例如,${1})人數的也支持(例如,以確保如果緊接着,比如說,000$1甚至承認,使用${1}000)。

  • ${name} ...包括通過由(?<name>...)替換字符串指定的命名組匹配的最後一個子。

  • $$ ...包括替換字符串中的一個"$"文字

  • $& ...包含整個匹配替換字符串的副本。

  • $` ......包括輸入字符串的所有文本之前替換字符串匹配

  • $' ...包括替換字符串匹配後輸入字符串的所有文本。

  • $+ ......包括最後組捕獲替換字符串。 [這免除了您需要知道的最後一組的具體指標。]

  • $_ ...包括替換字符串中整個輸入字符串。

最後,請注意:

  • 通常優選使用'...'爲正則表達式和替換字符串兩者。即,使用單引號的字符串,它們是非擴展的(非插值),因此可以避免與PowerShell自帶的前綴擴展$ - 前綴的標記混淆。
    如果您確實需要包括一個PowerShell的變量,你有兩個選擇:

    • 使用"..."(擴大字符串)和意爲正則表達式引擎` -escape $實例;例如,在`$1以下示例:
      'abc' -replace '(a)', "[`$1]-$HOME-",其產生類似[a]-C:\Users\jdoe-bc
    • 從使用字符串連接(+)字面件和變量引用建立您的串;例如: -
      'abc' -replace '(a)', ('[$1]-' + $HOME + '-')
  • -replace總是匹配全局,因此如果輸入的字符串中包含的多個匹配,則替代上述應用到每個匹配

+1

我希望我能給予好評兩次... –

1

-replace使用,不。因此你必須改變替換爲:

-replace '_s([0-9]{1,2})e([0-9]{1,2})', '_s$1_e$2_' 
1

我強烈建議regex101.com學習正則表達式。

像這樣的東西可以工作:

"VideoName_s01e01.mp4" -replace '(.*s)(\d+)(e.*)', '$1$2_$3' 

給出:

VideoName_s01_e01.mp4 
0

正則表達式是更好的解決方案,我建議其他與格式化數量和使用模板

$exampleoffile = @" 
namev1_s01e01.mp4 
namvev2_s03e02.mp4 
VideoName_s20e15.mp4 
VideoName_s15e1.mp4 
VideoName_s1e16.avi 
VideoName_s1e23.mv 
"@ 

[email protected]" 
{file*:{prefix:Test1}_s{season:01}e{episode:01}{extension:.mp4}} 
{file*:{prefix:1xxx}_s{season:100}e{episode:5}{extension:.mp4}} 
{file*:{prefix:yyy3}_s{season:10}e{episode:02}{extension:.havi}} 
"@ 



$exampleoffile | ConvertFrom-String -TemplateContent $template | 
% { "{0}_{1:D2}_e{2:D2}{3}" -f $_.file.prefix, [int]$_.file.season, [int]$_.file.episode, $_.file.extension }