Frage

Ich habe ein kleines Dienstprogramm, das eine Reihe von Dateien durchsucht. Ich musste es erstellen, da sowohl die Google- als auch die Windows -Desktop -Suche nicht die entsprechenden Zeilen in Dateien gefunden haben. Die Suche funktioniert gut (ich bin bereit, mich zu verbessern), aber eines der Dinge, die ich meinem Util hinzufügen möchte, ist ein Batch -Fund/Ersatz.

Wie wäre es also der beste Weg, eine Zeile aus einer Datei auszulesen, sie mit einem Suchbegriff zu vergleichen und zu vergleichen, dann die Linie aktualisieren und den Rest der Datei durchführen?

War es hilfreich?

Lösung

Ich würde für jede Datei Folgendes tun:

  • Führen Sie die Suche wie gewohnt durch. Überprüfen Sie auch, ob das Token ersetzt wird. Sobald Sie es gesehen haben, starten Sie diese Datei erneut. Wenn Sie das zu ersetzende Token nicht sehen, sind Sie fertig.
  • Wenn Sie erneut beginnen, erstellen Sie eine neue Datei und kopieren Sie jede Zeile, die Sie in der Eingabedatei lesen, und ersetzen Sie den Ersatz, während Sie gehen.
  • Wenn Sie mit der Datei fertig sind:
    • Verschieben Sie die aktuelle Datei in einen Sicherungsmateinamen
    • Verschieben Sie die neue Datei in den ursprünglichen Dateinamen
    • Löschen Sie die Sicherungsdatei

Achten Sie darauf, dass Sie dies nicht auf Binärdateien usw. tun - die Konsequenzen einer Textsuche und Ersetzen von Binärdateien wären normalerweise schlimm!

Andere Tipps

Wenn PowerShell eine Option ist, kann die unten definierte Funktion zum Durchführen von Fund- und Ersetzen über Dateien verwendet werden. Zum Beispiel zu finden 'a string' In Textdateien im aktuellen Verzeichnis würden Sie dies tun:

dir *.txt | FindReplace 'a string'

Ersetzen 'a string' Fügen Sie mit einem anderen Wert einfach den neuen Wert am Ende hinzu:

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

Sie können es auch in einer einzelnen Datei verwenden 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
}

Beachten Sie, dass Select-String Unterstützt auch REGEX -Übereinstimmungen, wurde jedoch einfach zu einfachen Übereinstimmungen beschränkt;) Sie können auch einen robusteren Ersatz wie Jon Vorgeschlagen, anstatt die Datei mit dem neuen Inhalt zu überschreiben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top