Как удалить текст с помощью регулярных выражений для всех файлов? - PullRequest
0 голосов
/ 03 октября 2018

Например, мои файлы

-a----       10/05/2018     22:15       12550016 01. Eat the Elephant (2018_07_06 06_26_52 UTC).mp3
-a----       10/05/2018     22:15       14163840 02. Disillusioned (2018_07_06 06_26_52 UTC).mp3
-a----       10/05/2018     22:15        9547648 03. The Contrarian (2018_07_06 06_26_52 UTC).mp3
-a----       10/05/2018     22:15       11272064 04. The Doomed (2018_07_06 06_26_52 UTC).mp3
-a----       10/05/2018     22:15       10649472 05. So Long, and Thanks for All the Fish (2018_07_06 06_26_52 UTC).mp3
-a----       10/05/2018     22:15        9961344 06. TalkTalk (2018_07_06 06_26_52 UTC).mp3
-a----       10/05/2018     22:15       12201856 07. By and Down the River (2018_07_06 06_26_52 UTC).mp3
-a----       10/05/2018     22:15        9183104 08. Delicious (2018_07_06 06_26_52 UTC).mp3
-a----       10/05/2018     22:15        5074816 09. DLB (2018_07_06 06_26_52 UTC).mp3
-a----       10/05/2018     22:15       12578688 10. Hourglass (2018_07_06 06_26_52 UTC).mp3
-a----       10/05/2018     22:15       13938560 11. Feathers (2018_07_06 06_26_52 UTC).mp3
-a----       10/05/2018     22:15       16031616 12. Get the Lead Out (2018_07_06 06_26_52 UTC).mp3

Я пытаюсь удалить из моих файлов весь текст между скобками, скобками и пробелом до первой скобки.

Я пробовал с этимСценарий ниже в PowerShell с использованием регулярных выражений, но он не работает, как я ожидал.

Get-ChildItem -Recurse | Rename-Item -NewName {$_.Name.Replace(" \((.*?)\)", "")}

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Поскольку вы хотите удалить определенную часть каждой строки, я использую скобки захвата, которые позволяют получить каждую часть, захваченную в переменных $ Matches, и поскольку существует только один блок скобок захвата, я использую индекс 1 для доступа к совпадениючасть в переменной $ Matches.

И результат переменной $ Matches выглядит следующим образом

А результат переменной $Matches выглядит следующим образом

Name                           Value                                                                                                 
----                           -----                                                                                                 
1                               (2018_07_06 06_26_52 UTC)                                                                            
0                              -a----       10/05/2018     22:15       13938560 11. Feathers (2018_07_06 06_26_52 UTC).mp3           

Чтобы выполнить замену, я проверяю, есть ли в переменной $ chain часть, соответствующая шаблону регулярного выражения. Если это так, я выполняю замену

$chain = "-a----       10/05/2018     22:15       13938560 11. Feathers (2018_07_06 06_26_52 UTC).mp3"
if($chain -match '.+(\s\(.+\)).+'){
    $new_filename = $chain.Replace($Matches[1], "")
}

После замены $new_filename будет содержать

-a----       10/05/2018     22:15       13938560 11. Feathers.mp3

Поскольку вы получаете список файлов с помощью Get-ChildItem -Recurse Вы можете сохранить результат в переменной, просмотреть результаты и проверить, есть ли у каждого элемента в массиве обрабатывающая часть, и выполнить замену

0 голосов
/ 03 октября 2018

Оператор PowerShell Replace принимает регулярное выражение.

Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name -Replace " \((.*?)\)", "" }

См. Переименование элемента в сочетании с оператором -Replace.

($_.Name.Replace просто заменяет текст / строку.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...