Замена любого контента между вторым и третьим подчеркиванием - PullRequest
0 голосов
/ 15 октября 2018

У меня есть сценарий PowerShell Scriptline, который заменяет (удаляет) символы между вторым и третьим подчеркиванием на «_»:

get-childitem *.pdf | rename-item -newname { $_.name -replace '_\p{L}+, \p{L}+_', "_"}

Примеры:

12345_00001_LastName, FirstName_09_2018_Text_MoreText.pdf
12345_00002_LastName, FirstName-SecondName_09_2018_Text_MoreText.pdf
12345_00003_LastName, FirstName SecondName_09_2018_Text_MoreText.pdf

This _\p{L}+, \p{L}+_регулярное выражение работает только для первого примера.Чтобы заменить все промежуточное, я использовал _(?:[^_]*)_([^_]*)_ (в соответствии с regex101 это должно почти сработать), но вывод:

12345_09_MoreText.pdf

Желаемый вывод будет:

 12345_00001_09_2018_Text_MoreText.pdf
 12345_00002_09_2018_Text_MoreText.pdf
 12345_00003_09_2018_Text_MoreText.pdf

Как сделатьЯ правильно заменяю второе и третье подчеркивание и все промежуточное на "_"?

Ответы [ 4 ]

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

Чтобы предложить альтернативное решение, которое позволяет избежать сложного регулярного выражения: следующее основано на операторах -split и -join и демонстрирует гибкость PowerShell в отношении нарезки массивов:

Get-ChildItem *.pdf | Rename-Item { ($_.Name -split '_')[0..1 + 3..6] -join '_' } -WhatIf
  • $_.Name -split '_' разбивает имя файла по _ на массив токенов (подстрок).
  • Срез массива [0..1 + 3..6] объединяет два выражения диапазона (..), чтобы по существу удалить токен с индексом 2 измассив.
  • -join '_' собирает измененный массив в _ -разделенную строку, давая желаемый результат.

Примечание: 6, верхнийПривязка к массиву жестко закодирована выше, что является неоптимальным, но достаточным с предсказуемым вводом, как в этом случае.

Начиная с Windows PowerShell v5.1 / PowerShell Core 6.1.0, для определения верхнегоограничен динамически , вам нужна помощь вспомогательной переменной, которая неуклюжа:

Get-ChildItem *.pdf |
  Rename-Item { ($arr = $_.Name -split '_')[0..1 + 3..($arr.Count-1)] -join '_' } -WhatIf

Не было бы неплохо, если бы мы могли написать [0..1 + 3..] вместо этого?Это и другие улучшения синтаксиса срезов PowerShell являются предметом предложения этой функции на GitHub .

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

Если вы не хотите использовать регулярное выражение -

$files = get-childitem *.pdf        #get all pdf files
$ModifiedFiles, $New = @()  #declaring two arrays
foreach($file in $files)
{
    $ModifiedFiles = $file.split("_")
    $ModifiedFiles = $ModifiedFiles | Where-Object { $_ -ne $ModifiedFiles[2] }     #ommitting anything between second and third underscore
    $New = "$ModifiedFiles" -replace (" ", "_")
    Rename-Item -Path $file.FullName -NewName $New
}

Пример данных -

$files = "12345_00001_LastName, FirstName_09_2018_Text_MoreText.pdf", "12345_00002_LastName, FirstName-SecondName_09_2018_Text_MoreText.pdf", "12345_00003_LastName, FirstName SecondName_09_2018_Text_MoreText.pdf"
$ModifiedFiles, $New = @()  #declaring two arrays
foreach($file in $files)
{
    $ModifiedFiles = $file.split("_")
    $ModifiedFiles = $ModifiedFiles | Where-Object { $_ -ne $ModifiedFiles[2] }     #ommitting anything between second and third underscore
    $New = "$ModifiedFiles" -replace (" ", "_")
}
0 голосов
/ 15 октября 2018

вот еще один способ ... использование строковых методов.

'12345_00003_LastName, FirstName SecondName_09_2018_Text_MoreText.pdf'.
    Split('_').
    Where({
        $_ -notmatch ','
        }) -join '_'

результат = 12345_00003_09_2018_Text_MoreText.pdf

, который делает следующее ...

  • разделить на подчеркивания
  • , чтобы выбросить любой элементс запятой
  • объедините оставшиеся элементы обратно в строку с подчеркиванием

Я подозреваю, что чистое решение регулярных выражений будет быстрее, но вы можете использовать это простоиметь что-то, что будет легче понять, когда вам в следующий раз потребуется изменить это.[ ухмылка ]

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

Вы можете использовать

-replace '^((?:[^_]*_){2})[^_]+_', '$1'

См. Демоверсию regex

Подробности

  • ^- начало строки
  • ((?:[^_]*_){2}) - Группа 1 (на значение будет ссылаться $1 из шаблона замены): два повторения
    • [^_]* - 0+ символовкроме подчеркивания
    • _ - подчеркивание
  • [^_]+ - 1 или более символов, отличных от _
    • _- подчеркивание
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...