替换 powershell 文件中的行

Replace lines in files on powershell

我有以下情况。我有一个巨大的文本,其中充满了带有 REPLACEMENT_CHARACTER“�”的单词。我的脚本已经生成了一本字典,它通过使用键值对提供了这些单词的正确翻译。看起来像:

"gew�hlte":  "gewählte"
"Betr�ge;":  "Beträge;"

我在这本词典中有大约 1200 个词条。在(巨大的)文本文件上,我循环使用此命令进行更正:

foreach($key in $solutionsDictionary.Keys)
{
    #Replace the key with value.
    [String]$value = $solutionsDictionary[$key]
    (Get-Content -encoding UTF8 $file) -replace [Regex]::Escape($key), "$value" | Set-Content -encoding UTF8 $file
}

但它的运行速度非常慢。为了加快它的速度,我想过滤真正包含这个字符的行,然后通过使用单词作为我的词典的键而不是尝试每个键直到找到正确的键来专门更正这些行。但是,我不知道如何在迭代中将一行写回到文件中,然后继续寻找下一行?新的不完整算法如下所示:

$SearchCharacter = '�'
$lines = get-content $file -encoding UTF8 | select-string $SearchCharacter
foreach ($line in $lines)
{
    # Split into words and find the ones which contain the searchCharacter
    $words = -split $line
    $words = @($words) -match $SearchCharacter

    foreach ($word in $words){
        # replace each word in the line.by using word as index.

        # Code missing here. How to write back a single line?
    }
}

如果 "select-string" 属性 是问题,我可以在没有它的情况下进行替换。 关于如何执行此操作的任何建议?非常感谢!


编辑: 出现了以下解决方案:

$SearchCharacter = '�'
Get-Content $file -encoding UTF8 |
ForEach-Object {
    If ($_.Contains($SearchCharacter)) {
        $Words = $_ -Split '\s+'
        $words = @($words) -match $SearchCharacter
        ForEach ($Word in $Words) {
            If ($solutionsDictionary.ContainsKey($Word))
            {
                $_.Replace([Regex]::Escape($Word), $solutionsDictionary[$Word])
            }
        }
    }
    $_
} | Set-Content -encoding UTF8 $Outfile

它到目前为止有效,但它还有另一个缺点。目标文件为每个更正的单词接收一行。我只是不知道如何防止这种情况。因此,例如使用该输入:

Das hier r�ckg�ngig ist das zu machen
r�ckg�ngig : ist bereits geamcht
Weitere W�rter gibt ers zu korrigieren
Hier noch ein bl�des Wort
zwei in einer Zeile G�hte und Gr��e

我得到了这个解决方案:

Das hier rückgängig ist das zu machen
Das hier r�ckg�ngig ist das zu machen
rückgängig : ist bereits geamcht
r�ckg�ngig : ist bereits geamcht
Weitere Wörter gibt ers zu korrigieren
Weitere W�rter gibt ers zu korrigieren
Hier noch ein blödes Wort
Hier noch ein bl�des Wort
zwei in einer Zeile Göhte und Gr��e
zwei in einer Zeile G�hte und Größe
zwei in einer Zeile G�hte und Gr��e

那么如何防止 PowerShell 为每次更正写一个新行?


编辑2:

正确的解决方案是插入 $_=

的赋值
$SearchCharacter = '�'
Get-Content $file -encoding UTF8 |
ForEach-Object {
    If ($_.Contains($SearchCharacter)) {
        $Words = $_ -Split '\s+'
        $words = @($words) -match $SearchCharacter
        ForEach ($Word in $Words) {
            If ($solutionsDictionary.ContainsKey($Word))
            {
                $_ = $_.Replace([Regex]::Escape($Word), $solutionsDictionary[$Word])
            }
        }
    }
    $_
} | Set-Content -encoding UTF8 $Outfile

我会使用你的第二个想法和每个 $Line 的 PowerShell 管道和一个 hash table 来检查特殊词:

$SearchCharacter = '�'
$ux4 = '\u{0:X4}' -f [bitconverter]::ToInt16([System.Text.Encoding]::Unicode.GetBytes($SearchCharacter))

$HashTable = ConvertFrom-StringData -Delimiter ':' '
gew�hlte: gewählte
Betr�ge: Beträge
'

Get-Content .\InFile.txt -encoding UTF8 |
ForEach-Object {
    If ($_ -Match "[\w$ux4]*$ux4+[\w$ux4]*") {
        ForEach ($Word in $Matches.Values) {
            If ($HashTable.ContainsKey($Word)) { $_ = $_.Replace($Word, $HashTable[$Word]) }
        }
    }
    $_
} | Set-Content -encoding UTF8 .\OutFile.txt