使用powershell替换文本文件的行,基于不同文本文件的行

时间:2016-08-11 20:10:09

标签: file powershell text replace edit

所以我有2个文件具有相同的列出内容样式 - 字体ID,字体Def和时间戳。我想获取第二个新字体文件,并使用powershell替换第一个具有匹配字体ID的文件的行(没有数据库,这将大大简化)。

File2 text line = [FontIDA01] 5,5,5,5,randomtext,11/10/2001 应该替换[FontIDA01]匹配的File1行,并将5,5,5,5替换为6,6,6,6,并将日期替换为该行上的日期。

$content = Get-Content $fileSelected #(path chosen by user)
$masterContent = Get-Content $masterContentPath #(hardcoded path)
foreach($line in content)
{
   $fontID = $line.SubString($startFontID, $endFontID)#this just sets font id = 23jkK instead of [23jkK]
   foreach($masterLine in $masterContent)
   {
      if ($masterLine.Contains($fontID))
      {
         $masterContent -replace $masterLine, $line where-Object{$_.Name -contains $fontID} | Set-Content $masterContent -raw 
      }
   }
}

我甚至关闭了吗?

1 个答案:

答案 0 :(得分:1)

在字典中收集新数据并将其用于替换:

# get new data in a dictionary
$newData = @{}
Get-Content 2.txt | %{
    $parts = $_ -split ' '
    $newData[$parts[0]] = @{numbers=$parts[1]; date=$parts[3]}
}

#patch original data using the new data dictionary
Get-Content 1.txt | %{
    $parts = $_ -split ' '
    $id = $parts[0]
    $new = $newData[$id]
    if ($new) {
        $id, $new.numbers, $parts[2], $new.date -join ' '
    } else {
        $_
    }
} | Out-File 3.txt -Encoding utf8

此代码假设字段由空格分隔,因此如果不是这种情况,您将不得不使用其他方法来提取诸如Select-String或regexp匹配的部分:if ($_ -match '(.+?) ([\d,]+) and so on') { $id = $matches[0] }