Чтение и обновление файлового потока - PullRequest
0 голосов
/ 05 декабря 2008

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

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

Ответы [ 2 ]

2 голосов
/ 05 декабря 2008

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

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

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

0 голосов
/ 07 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...