与简单的Perl正则表达式搜索等效的Powershell替换一根衬板,以在UCS-2LE或UTF-16 Little Endian文件中查找替换

时间:2019-05-07 22:00:05

标签: windows powershell batch-file cmd

这个问题与另一个问题有关,该问题采用perl方式,但是由于Windows错误而发现了很多困难。 (请参阅Perl or Powershell how to convert from UCS-2 little endian to utf-8 or do inline oneliner search replace regex on UCS-2 file

我希望在Little Endian UCS-2格式文件(UCS-2LE与UTF-16 Little Endian相同)上使用与简单perl regex等效的POWERSHELL。即:

perl -pi.bak -e 's/search/replace/g;' MyUCS-2LEfile.txt

您可能需要告诉Powershell gci输入文件为ucs2-le,并且您还希望输出文件为相同的UCS-2LE(Windows CR LF)格式,等等。

1 个答案:

答案 0 :(得分:1)

这将在正则表达式后输出文件。输出文件不是以BOM表开头。这应该适用于小文件。对于大文件,可能需要快速进行更改。

$fin = 'C:/src/t/revbom-in.txt'
$fout = 'C:/src/t/revbom-out.txt'
if (Test-Path -Path $fout) { Remove-Item -Path $fout }

# Create a file for input
$UCS2LENoBomEncoding = New-Object System.Text.UnicodeEncoding $False, $False
[System.IO.File]::WriteAllLines($fin, "now is the time`r`nwhen was the time", $UCS2LENoBomEncoding)

# Read the file in, replace string, write file out
[System.IO.File]::ReadLines($fin, $UCS2LENoBomEncoding) |
    ForEach-Object {
        [System.IO.File]::AppendAllLines($fout, [string[]]($_ -replace 'the','a'), $UCS2LENoBomEncoding)
    }

HT:对于{string []]强制转换,https://gist.github.com/refactorsaurusrex/9aa6b72f3519dbc71f7d0497df00eeb1的@refactorsaurusrex

NB:位于https://gist.github.com/mklement0/acb868a9f15d9a34b6e88fc874b3851d的mklement0

注意:如果源文件是HTML,请参见https://stackoverflow.com/a/1732454/447901