0

我有一个小实用程序可以搜索多个文件。我不得不创建它,因为 Google 和 Windows 桌面搜索都没有在文件中找到合适的行。搜索工作正常(我愿意改进它),但我想添加到我的实用程序中的一件事是批量查找/替换。

那么如何从文件中读取一行,将其与搜索词进行比较,如果它通过,然后更新该行,并继续浏览文件的其余部分,那么最好的方法是什么?

4

2 回答 2

2

我会为每个文件执行以下操作:

  • 像往常一样进行搜索。还要检查要替换的令牌。看到它后,请重新启动该文件。如果您没有看到要替换的令牌,那么您就完成了。
  • 当您重新开始时,创建一个新文件并复制从输入文件中读取的每一行,随时进行替换。
  • 完成文件后:
    • 将当前文件移动到备份文件名
    • 将新文件移动到原始文件名
    • 删除备份文件

请注意不要在二进制文件等上执行此操作 - 对二进制文件进行文本搜索和替换的后果通常是可怕的!

于 2008-12-04T21:14:31.803 回答
0

如果 PowerShell 是一个选项,则下面定义的函数可用于跨文件执行查找和替换。例如,要'a string'在当前目录中的文本文件中查找,您可以:

dir *.txt | FindReplace 'a string'

要替换'a string'为另一个值,只需在末尾添加新值:

dir *.txt | FindReplace 'a string' 'replacement string'

您也可以使用FindReplace -path MyFile.txt 'a string'.

function FindReplace( [string]$search, [string]$replace, [string[]]$path ) {
  # Include paths from pipeline input.
  $path += @($input)

  # Find all matches in the specified files.
  $matches = Select-String -path $path -pattern $search -simpleMatch

  # If replacement value was given, perform replacements.
  if( $replace ) {
    # Group matches by file path.
    $matches | group -property Path | % {
      $content = Get-Content $_.Name

      # Replace all matching lines in current file.
      foreach( $match in $_.Group ) {
        $index = $match.LineNumber - 1
        $line = $content[$index]
        $updatedLine = $line -replace $search,$replace
        $content[$index] = $updatedLine

        # Update match with new line value.
        $match | Add-Member NoteProperty UpdatedLine $updatedLine
      }

      # Update file content.
      Set-Content $_.Name $content
    }
  }

  # Return matches.
  $matches
}

请注意,它Select-String也支持正则表达式匹配,但为了简单起见,仅限于简单匹配;)您还可以像Jon建议的那样执行更强大的替换,而不仅仅是用新内容覆盖文件。

于 2008-12-07T15:13:19.940 回答