我有一个小实用程序,可以搜索许多文件。我必须创建它,因为Google和Windows桌面搜索都没有在文件中找到适当的行。搜索效果很好(我愿意改进它),但是我想添加到util的一件事是批次查找/替换。

那么,如何从文件中读取行,将其与搜索词进行比较以及是否通过,然后更新线并继续通过文件的其余部分进行比较?

有帮助吗?

解决方案

我会为每个文件做以下内容:

  • 正常进行搜索。还要检查是否要替换令牌。一旦看到它,请重新开始该文件。如果您看不到要替换的令牌,那就完成了。
  • 重新开始时,创建一个新文件,然后复制您从输入文件中读取的每一行,在进行时进行替换。
  • 完成文件后:
    • 将当前文件移至备份文件名
    • 将新文件移至原始文件名
    • 删除备份文件

请注意,您不要在二进制文件等上进行此操作 - 进行文本搜索并替换二进制文件的后果通常会很可怕!

其他提示

如果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 还支持REGEX比赛,但已限制为简单的匹配项,以简单地;)您还可以执行更强大的替代品 乔恩 建议,而不仅仅是用新内容覆盖文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top