Leggi & amp; Aggiorna filestream
-
19-08-2019 - |
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?
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.