Заменить несколько строк в нескольких файлах - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь заменить несколько строк во всех файлах в папке.Проблема в том, что оператор -relace не учитывает точные слова, которые мне нужно заменить, например:

Мне нужно заменить строки:

  1. RUN → Выполнить
  2. RUNMODAL → RunModal

Теперь, когда я запускаю свой скрипт, он заменяет строки RUN на Run, что хорошо, но он заменяет также RUNMODAL на RunMODAL и не учитывает мое второе условие.Есть ли способ указать, что должны приниматься во внимание только точные совпадения или, по крайней мере, для каждой замены я бы указывал количество символов, которые следует учитывать при замене конкретной строки?

$AllFiles = Get-ChildItem $FilePath

foreach ($file in $AllFiles) {
    (Get-Content $file.PSPath) | ForEach {
        $_ -creplace 'RUN', 'Run' `
           -creplace 'RUNMODAL', 'RunModal'
    } | Set-Content  $file.PSPath
}

Редактировать:

Возможно, лучшим примером будет:

  1. ПОЛЕ → поле
  2. NEWFIELD → NewField

Даже если я переключу их на, я получу либо NEWfield, либо Newfield, и мне нужен NewField.

Ответы [ 3 ]

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

Используйте границы слов (\b) в строках поиска, чтобы обеспечить замену только полных слов.И вам не нужен вложенный цикл.Операторы замены могут использоваться непосредственно в списках.

Get-ChildItem $FilePath | ForEach-Object {
    (Get-Content $_.FullName) -creplace '\bRUN\b', 'Run' `
            -creplace '\bRUNMODAL\b', 'RunModal' `
            -creplace '\bFIELD\b', 'NewField' |
        Set-Content  $_.FullName
}
0 голосов
/ 10 октября 2018

Я нашел и другое решение:

foreach ($file in $AllFiles) 
{
    (Get-Content $file.PSPath) | ForEach-Object {
        $line = $_

        $lookupTable.GetEnumerator() | ForEach-Object {
            if ($line -like $_.Key)
            {
                $line = $line -replace $_.Key, $_.Value
            }
        }
       $line
    } | Set-Content $file.PSPath
}

Я тоже попробую ваше.Спасибо!

0 голосов
/ 10 октября 2018
$AllFiles = Get-ChildItem $FilePath

(Get-Content $file.PSPath) |
ForEach {
       $_ -creplace 'RUNMODAL', 'RunModal' `
          -creplace 'RUN', 'Run'
} | Set-Content  $file.PSPath
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...