Domanda

Ho una piccola utility che fa una ricerca di un numero di file. Ho dovuto crearlo perché sia ??Google & amp; Le ricerche sul desktop di Windows non hanno trovato le righe appropriate nei file. La ricerca funziona bene (sono disposto a migliorarla), ma una delle cose che vorrei aggiungere al mio programma di utilità è una ricerca / sostituzione in batch.

Quindi quale sarebbe il modo migliore per leggere una riga da un file, confrontarla con un termine di ricerca e se passa, quindi aggiornare la riga e continuare per il resto del file?

È stato utile?

Soluzione

Vorrei fare quanto segue per ogni file:

  • Esegui la ricerca normalmente. Controlla anche il token da sostituire. Non appena l'hai visto, riavvia quel file. Se non vedi il token da sostituire, il gioco è fatto.
  • Quando ricomincia, crea un nuovo file e copia ogni riga che leggi dal file di input, eseguendo la sostituzione mentre procedi.
  • Al termine del file:
    • Sposta il file corrente in un nome file di backup
    • Sposta il nuovo file nel nome file originale
    • Elimina il file di backup

Fai attenzione a non farlo su file binari, ecc., le conseguenze di fare una ricerca testuale e sostituirla su file binari di solito sarebbero terribili!

Altri suggerimenti

Se PowerShell è un'opzione, è possibile utilizzare la funzione definita di seguito per trovare e sostituire file. Ad esempio, per trovare 'una stringa' nei file di testo nella directory corrente, dovresti:

dir *.txt | FindReplace 'a string'

Per sostituire 'una stringa' con un altro valore, basta aggiungere il nuovo valore alla fine:

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

Puoi anche chiamarlo su un singolo file usando FindReplace -path MyFile.txt 'una stringa' .

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 

Se PowerShell è un'opzione, è possibile utilizzare la funzione definita di seguito per trovare e sostituire file. Ad esempio, per trovare 'una stringa' nei file di testo nella directory corrente, dovresti:

dir *.txt | FindReplace 'a string'

Per sostituire 'una stringa' con un altro valore, basta aggiungere il nuovo valore alla fine:

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

Puoi anche chiamarlo su un singolo file usando FindReplace -path MyFile.txt 'una stringa' .

<*>

Nota che Select-String supporta anche corrispondenze regex, ma è stata vincolata a corrispondenze semplici per semplicità;) Puoi anche eseguire una sostituzione più solida come suggerito Jon , anziché semplicemente sovrascrivere il file con il nuovo contenuto.

.Name # Replace all matching lines in current file. foreach( $match in

Se PowerShell è un'opzione, è possibile utilizzare la funzione definita di seguito per trovare e sostituire file. Ad esempio, per trovare 'una stringa' nei file di testo nella directory corrente, dovresti:

dir *.txt | FindReplace 'a string'

Per sostituire 'una stringa' con un altro valore, basta aggiungere il nuovo valore alla fine:

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

Puoi anche chiamarlo su un singolo file usando FindReplace -path MyFile.txt 'una stringa' .

<*>

Nota che Select-String supporta anche corrispondenze regex, ma è stata vincolata a corrispondenze semplici per semplicità;) Puoi anche eseguire una sostituzione più solida come suggerito Jon , anziché semplicemente sovrascrivere il file con il nuovo contenuto.

.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

Se PowerShell è un'opzione, è possibile utilizzare la funzione definita di seguito per trovare e sostituire file. Ad esempio, per trovare 'una stringa' nei file di testo nella directory corrente, dovresti:

dir *.txt | FindReplace 'a string'

Per sostituire 'una stringa' con un altro valore, basta aggiungere il nuovo valore alla fine:

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

Puoi anche chiamarlo su un singolo file usando FindReplace -path MyFile.txt 'una stringa' .

<*>

Nota che Select-String supporta anche corrispondenze regex, ma è stata vincolata a corrispondenze semplici per semplicità;) Puoi anche eseguire una sostituzione più solida come suggerito Jon , anziché semplicemente sovrascrivere il file con il nuovo contenuto.

.Name $content } } # Return matches. $matches }

Nota che Select-String supporta anche corrispondenze regex, ma è stata vincolata a corrispondenze semplici per semplicità;) Puoi anche eseguire una sostituzione più solida come suggerito Jon , anziché semplicemente sovrascrivere il file con il nuovo contenuto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top