2008-12-04 7 views
0

У меня есть небольшая утилита, которая выполняет поиск по нескольким файлам. Я должен был создать его, потому что Google & Поиск в Windows Desktop не нашел соответствующих строк в файлах. Поиск работает отлично (я готов улучшить его), но одна из вещей, которые я хотел бы добавить к моему утилиту, - это пакетный поиск/замена.Чтение и обновление filestream

Как лучше всего прочитать строку из файла, сравнить ее с поисковым термином, и если она пройдет, а затем обновить строку и продолжить работу с остальной частью файла?

ответ

2

Я хотел бы сделать следующее для каждого файла:

  • Выполните поиск в обычном режиме. Также проверьте, заменит ли токен. Как только вы это увидите, снова запустите этот файл. Если вы не видите замену маркера, все готово.
  • Когда вы начинаете заново, создайте новый файл и скопируйте каждую строку, которую вы читаете из входного файла, выполнив замену по мере ее поступления.
  • Когда вы закончили с файлом:
    • Переместить текущий файл резервной копии файла
    • Переместите новый файл в исходное имя файла
    • Удалить файл резервной копии

Будьте осторожны, чтобы вы не делали этого в двоичных файлах и т. Д., Хотя последствия текстового поиска и замены в двоичных файлах обычно были бы ужасными!

+0

Существует компромисс. Если вы знаете, что, скорее всего, файлы будут иметь SearchTerm, может быть лучше запустить временный файл, копирующий содержимое другого файла по мере его поступления. Вместо поиска в файле дважды. – grepsedawk 2008-12-04 22:17:58

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 предложил, а не просто перезаписать файл с новым содержанием.

 Смежные вопросы

  • Нет связанных вопросов^_^