首页 > 解决方案 > 如何 - 仅查找和替换第一个匹配项

问题描述

我有一个似乎可以正常工作的脚本,只有它才能正常工作。我的文件包含多行字符串“PROCEDURE DIVISION。”,句号在末尾。

我需要做什么...

仅删除字符串“PROCEDURE DIVISION”的 [第 2 次出现]。如果它在文本文件中两次,如果只找到一次则绕过文件。我需要保留第一次出现并更改/删除第二次出现。

我可以轻松找到并替换所有出现,我不知道如何只替换 2 个中的 1 个。

这可以使用Powershell吗?

到目前为止,这是我的代码...

Get-ChildItem 'C:\Temp\*.cbl' -Recurse | ForEach {#
     (Get-Content $_ | ForEach   { $_ -replace "PROCEDURE DIVISION\.", "                   "}) | Set-Content $_ 
} 

更新

我得到了这个工作,它并不漂亮。

唯一的问题是在评论部分捕获字符串。我需要做的只是当字符串从每行的第 8 位开始时才算作命中。

那可能吗?

Get-ChildItem 'C:\Thrivent\COBOL_For_EvolveWare\COBOL\COBOL\*.*' -Recurse | ForEach {
     ($cnt=(Get-Content $_ | select-string -pattern "PROCEDURE DIVISION").length)
     if ($cnt -gt "1") {
        (Get-Content $_ | ForEach   { $_ -replace "PROCEDURE DIVISION\.", "                   "}) | Set-Content $_
           $FileName = $_.FullName
           Write-Host "$FileName = $cnt" -foregroundcolor green
      } 

标签: powershellreplacefind

解决方案


你可以用switch这个:

Get-ChildItem -Path 'C:\Temp' -Filter '*.cbl' -File -Recurse | ForEach-Object {
    $occurrence     = 0
    $contentChanged = $false
    $newContent = switch -Regex -File $_.FullName {
        'PROCEDURE DIVISION\.' { 
            $occurrence++
            if ($occurrence -eq 2) {
                $_ -replace 'PROCEDURE DIVISION\.', "                   "
                $contentChanged = $true
            }
            else { $_ }
        }
        default { $_ }
    }
    # only rewrite the file if a change has been made
    if ($contentChanged) {
        Write-Host "Updating file '$($_.FullName)'"
        $newContent | Set-Content -Path $_.FullName -Force
    }
}

推荐阅读