替换多个文件中的多个字符串

时间:2018-10-10 20:11:09

标签: powershell

我正在尝试替换文件夹中所有文件中的多个字符串。问题是-replace运算符没有考虑到我需要替换的确切单词,例如:

我需要替换字符串:

  1. 运行→运行
  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. FIELD→字段
  2. NEWFIELD→NewField

即使我将它们切换为NEWfield或Newfield,也需要NewField。

3 个答案:

答案 0 :(得分:1)

在搜索字符串中使用单词边界(\b),以确保仅替换完整的单词。而且您不需要嵌套循环。替换运算符可以直接在列表上使用。

Get-ChildItem $FilePath | ForEach-Object {
    (Get-Content $_.FullName) -creplace '\bRUN\b', 'Run' `
            -creplace '\bRUNMODAL\b', 'RunModal' `
            -creplace '\bFIELD\b', 'NewField' |
        Set-Content  $_.FullName
}

答案 1 :(得分:0)

$AllFiles = Get-ChildItem $FilePath

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

答案 2 :(得分:0)

我确实找到了另一种解决方案:

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
}

我也会尝试您的。谢谢!