使用Powershell替换文件中的多行文本而不使用Regex

时间:2013-12-17 17:23:33

标签: powershell replace

我有以下Powershell脚本:

$oldCode =  @"
            <div id="time_estimate">
                <!-- some large table -->
            </div>
"@

$newCode = @"
            <div id="time_estimate">
                                <!-- nested divs and spans -->
                                <div id="contact-form">

                                        <?php include "contact-form.php"; ?>
                                </div>
                        </div>
"@

ls *.html | foreach { 
        $fileContent = [System.Io.File]::ReadAllText($_.FullName)
        $newFileContent = $fileContent.Replace($oldCode, $newCode)
        [System.Io.File]::WriteAllText($_.FullName, $newFileContent)
        Write-Host  "`r`n"
        Write-Host  "Processed - $($_.Name)...`r`n" }

这似乎没有取代文字。这是多行字符串的问题,还是Replace()方法的限制?我更愿意在没有引入正则表达式的情况下进行替换。

3 个答案:

答案 0 :(得分:3)

您使用的是哪个版本的PowerShell?如果您使用的是v3或更高版本,请尝试以下操作:

ls *.html | foreach { 
    $fileContent = Get-Content $_.FullName -Raw
    $newFileContent = $fileContent -replace $oldCode, $newCode
    Set-Content -Path $_.FullName -Value $newFileContent
    Write-Host  "`r`n"
    Write-Host  "Processed - $($_.Name)...`r`n" 
}

答案 1 :(得分:1)

为了Pete的缘故,don't even think关于使用HTML正则表达式。

您遇到的问题是读取文件会为您提供一系列字符串。 Replace()不知道数组,所以你必须手工完成。你可以用-join创建一个大字符串,如此,

$fileContent = [System.Io.File]::ReadAllText($_.FullName)
$theOneString = $fileContent -join ' '
$theOneString.Replace($foo, $bar)

...但这会搞砸你的换行符。然后,您可以使用HTML Tidy重新格式化字符串。

手动方式是逐行迭代源数组。在找到<div>之前,请将内容复制到新目标数组中。找到可替换部件后,将其余的新内容插入目标阵列。继续阅读并丢弃源阵列,直到找到</div>并将所有其余内容复制到目标阵列中。最后保存目标数组的内容,你就完成了。

答案 2 :(得分:0)

我不会使用字符串替换来修改HTML代码。许多可能在意想不到的方向发展的事情。尝试这样的事情:

$newCode = @"
<!-- nested divs and spans -->
<div id="contact-form">
  <?php include "contact-form.php"; ?>
</div>
"@

Get-ChildItem '*.html' | % {
  $html = New-Object -COM HTMLFile
  $html.write([IO.File]::ReadAllText($_.FullName))
  $html.getElementById('time_estimate').innerHTML = $newCode
  [IO.File]::WriteAllText($_.FullName, $html.documentElement.outerHTML)
}

如果需要,您可以使用Tidy

来美化HTML
$newCode = @"
<!-- nested divs and spans -->
<div id="contact-form">
  <?php include "contact-form.php"; ?>
</div>
"@

[Reflection.Assembly]::LoadFile('C:\path\to\Tidy.dll') | Out-Null
$tidy = New-Object Tidy.DocumentClass

Get-ChildItem '*.html' | % {
  $html = New-Object -COM HTMLFile
  $html.write([IO.File]::ReadAllText($_.FullName))
  $html.getElementById('time_estimate').innerHTML = $newCode
  $tidy.ParseString($html.documentElement.outerHTML)
  $tidy.SaveFile($_.FullName) | Out-Null
}