Replace multiline text in a file using Powershell without using Regex

前端 未结 3 1617
广开言路
广开言路 2021-01-14 03:49

I have the following Powershell script:

$oldCode =  @\"
            
相关标签:
3条回答
  • 2021-01-14 04:38

    For Pete's sake, don't even think about using regex for HTML.

    The problem you met is that reading a file will provide you an array of strings. Replace() doesn't know about arrays, so you got to work it by hand. You could create a big string with -join like so,

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

    ... But this will mess up your line breaks. Then again, you could reformat the string with HTML Tidy.

    The manual way is to iterate the source array row by row. Until you find the <div>, copy the contents into new destination array. After finding the replacable part, insert rest of the new stuff into the destination array. Keep reading and discarding the source array untill you find the </div> and copy all the rest into the destination array. Finally save the destination array's contents and you are done.

    0 讨论(0)
  • 2021-01-14 04:52

    I wouldn't use string replacements for modifying HTML code. To many things that could develop in unexpected directions. Try something like this:

    $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)
    }
    

    If needed you can can prettify the HTML by using Tidy:

    $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
    }
    
    0 讨论(0)
  • 2021-01-14 04:55

    What version of PowerShell are you using? If you're using v3 or higher, try this:

    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" 
    }
    
    0 讨论(0)
提交回复
热议问题