Regex Powershell匹配正则表达式并替换

Regex Powershell匹配正则表达式并替换,regex,powershell,Regex,Powershell,我有一个大文件,我正在搜索以查找和替换无效日期。我使用正则表达式来定位日期,然后确定它们是否有效。如果脚本发现无效日期,则需要将该日期替换为当前日期。出于审计目的,我需要记录无效字符串和发现错误的行号。到目前为止(在之前的帮助下),我已经能够找到无效的日期,但我还不能成功地更改它们 这是我用来定位无效日期的代码。如何在一次通行证中查找和更改日期 $matchInfos = @(Select-String -Pattern $regex -AllMatches -Path $file) forea

我有一个大文件,我正在搜索以查找和替换无效日期。我使用正则表达式来定位日期,然后确定它们是否有效。如果脚本发现无效日期,则需要将该日期替换为当前日期。出于审计目的,我需要记录无效字符串和发现错误的行号。到目前为止(在之前的帮助下),我已经能够找到无效的日期,但我还不能成功地更改它们

这是我用来定位无效日期的代码。如何在一次通行证中查找和更改日期

$matchInfos = @(Select-String -Pattern $regex -AllMatches -Path $file)
foreach ($minfo in $matchInfos)
{
    #"LineNumber $($minfo.LineNumber)"
    foreach ($match in @($minfo.Matches | Foreach {$_.Groups[0].value}))
    {
        if (([Boolean]($match -as [DateTime]) -eq $false ) -or ([DateTime]::parseexact($match,"MM-dd-yyyy",$null).Year -lt "1800")) {
            Write-host "Invalid date on line $($minfo.LineNumber) - $match"
            #Add-Content -Path $LOGFILE -Value "Invalid date on line $($minfo.LineNumber) - $match"

            # Replace the invalid date with a corrected one
            Write-Host "Replacing $match with $(Get-Date -Format "MM-dd-yyyy")"
            #Add-Content -Path $LOGFILE -Value "Replacing $match with $(Get-Date -Format "MM-dd-yyyy")"

        }
    }
 }

您必须写出一个带有更改的临时文件,并用临时文件替换该文件。下面是我写的一篇文章,它将为您完成这一部分:

使用示例:

replace-filestring -pattern 'find' -replacement 'replace' -path myfile.txt -overwrite
使用此命令,脚本将读取myfile.txt,将“find”替换为“replace”,将输出写入临时文件,然后将myfile.txt替换为临时文件。(如果没有-Overwrite参数,脚本将只输出带有更改的myfile.txt的内容。)

账单

下面是一些关于如何解决这个问题的伪代码。不知道你的文件有多大。阅读和写作可能很慢

$lines = get-content $file
$len = $lines.count
$bad = @{}
for($i=0;$i-lt$len;$i++){
    if($lines[$i] -match ""){
        $bad_date = $lines[$i].substring(10) #Get the bad date
        $good_date = Get-Date -Format G
        $bad["$i"] += @($line[$i])
        $lines[$i] = $lines[$i].Replace($bad_date,$good_date)
    }
}
$lines > $NewFile
$bad > $bad_date_file