Pregunta

Tengo una pequeña utilidad que realiza una búsqueda de varios archivos. Tuve que crearlo porque tanto Google & amp; Las búsquedas en el escritorio de Windows no encontraban las líneas apropiadas en los archivos. La búsqueda funciona bien (estoy dispuesto a mejorarla) pero una de las cosas que me gustaría agregar a mi utilidad es buscar / reemplazar por lotes.

Entonces, ¿cómo sería la mejor manera de leer una línea de un archivo, compararla con un término de búsqueda y, si pasa, actualizar la línea y continuar con el resto del archivo?

¿Fue útil?

Solución

Haría lo siguiente para cada archivo:

  • Haz la búsqueda de la forma habitual. También verifique el token para reemplazar. Tan pronto como lo haya visto, inicie ese archivo nuevamente. Si no ve el token para reemplazar, ya está.
  • Cuando comience de nuevo, cree un nuevo archivo y copie cada línea que lea del archivo de entrada, haciendo el reemplazo a medida que avanza.
  • Cuando haya terminado con el archivo:
    • Mover el archivo actual a un nombre de archivo de respaldo
    • Mover el nuevo archivo al nombre de archivo original
    • Eliminar el archivo de copia de seguridad

Tenga cuidado de no hacer esto en archivos binarios, etc., sin embargo, ¡las consecuencias de hacer una búsqueda textual y reemplazar en archivos binarios generalmente serían terribles!

Otros consejos

Si PowerShell es una opción, la función definida a continuación se puede usar para buscar y reemplazar archivos. Por ejemplo, para encontrar 'una cadena' en archivos de texto en el directorio actual, debería hacer:

dir *.txt | FindReplace 'a string'

Para reemplazar 'una cadena' con otro valor, simplemente agregue el nuevo valor al final:

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

También puede llamarlo en un solo archivo usando FindReplace -path MyFile.txt 'una cadena' .

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 

Si PowerShell es una opción, la función definida a continuación se puede usar para buscar y reemplazar archivos. Por ejemplo, para encontrar 'una cadena' en archivos de texto en el directorio actual, debería hacer:

dir *.txt | FindReplace 'a string'

Para reemplazar 'una cadena' con otro valor, simplemente agregue el nuevo valor al final:

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

También puede llamarlo en un solo archivo usando FindReplace -path MyFile.txt 'una cadena' .

<*>

Tenga en cuenta que Select-String también admite coincidencias de expresiones regulares, pero se ha limitado a coincidencias simples por simplicidad;) También puede realizar un reemplazo más robusto como sugirió Jon , en lugar de simplemente sobrescribir el archivo con el nuevo contenido.

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

Si PowerShell es una opción, la función definida a continuación se puede usar para buscar y reemplazar archivos. Por ejemplo, para encontrar 'una cadena' en archivos de texto en el directorio actual, debería hacer:

dir *.txt | FindReplace 'a string'

Para reemplazar 'una cadena' con otro valor, simplemente agregue el nuevo valor al final:

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

También puede llamarlo en un solo archivo usando FindReplace -path MyFile.txt 'una cadena' .

<*>

Tenga en cuenta que Select-String también admite coincidencias de expresiones regulares, pero se ha limitado a coincidencias simples por simplicidad;) También puede realizar un reemplazo más robusto como sugirió Jon , en lugar de simplemente sobrescribir el archivo con el nuevo contenido.

.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

Si PowerShell es una opción, la función definida a continuación se puede usar para buscar y reemplazar archivos. Por ejemplo, para encontrar 'una cadena' en archivos de texto en el directorio actual, debería hacer:

dir *.txt | FindReplace 'a string'

Para reemplazar 'una cadena' con otro valor, simplemente agregue el nuevo valor al final:

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

También puede llamarlo en un solo archivo usando FindReplace -path MyFile.txt 'una cadena' .

<*>

Tenga en cuenta que Select-String también admite coincidencias de expresiones regulares, pero se ha limitado a coincidencias simples por simplicidad;) También puede realizar un reemplazo más robusto como sugirió Jon , en lugar de simplemente sobrescribir el archivo con el nuevo contenido.

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

Tenga en cuenta que Select-String también admite coincidencias de expresiones regulares, pero se ha limitado a coincidencias simples por simplicidad;) También puede realizar un reemplazo más robusto como sugirió Jon , en lugar de simplemente sobrescribir el archivo con el nuevo contenido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top