2008-11-06 13 views
18

Estoy buscando una herramienta para reemplazar varias líneas en un proyecto. Por ejemplo:Herramienta de búsqueda y reemplazo de líneas múltiples

#include "../DiscreteIO/Discrete.h" 
#include "../PCI/pci.h" 
#include "../Arinc429/ARINC429.h" 

con

#include "../PCI/pci.h" 
#include "../DiscreteIO/DiscreteHW.h" 
#include "../DiscreteIO/Discrete.h" 

He intentado dos herramientas que funcionan para este tipo de búsqueda y reemplazo. Wildedit y Actual search and replace Ambos parecen ser excelentes herramientas pero son shareware. ¿Alguien sabe de herramientas similares? ¿Hay algo gratis o es hora de desprenderse de algo de dinero?

Aclaración:

a través de un proyecto en este caso significa un millar más c archivos. Los editores de texto pueden hacer esto solo un archivo a la vez (Textpad, Bloc de notas de programadores) o en todos los archivos abiertos (nodepad ++). No he probado ninguno de los otros editores pero supongo que tendrán problemas similares. Por favor, corríjame si estoy equivocado.

Herramientas como sed & awk es una solución pero presenta problemas ya que no los utilizo con regularidad y necesito dedicar algo de tiempo para hacer que funcione, ya que no soy un experto en herramientas.

La respuesta es: Todo ello ...

ultraedit puede trabajar pero ya tengo un editor y el precio es caro si sólo voy a utilizarlo como una herramienta de búsqueda y reemplazo.

Las herramientas basadas en Sed, AWK y expresión regular pueden funcionar, pero pueden ser un problema en algunos casos.

Wild Edit puede funcionar y no es tan caro.

Mi decisión al final es trabajar mis habilidades de expresión regular.

+0

Como se muestra en el tutorial al que me he vinculado en mi respuesta, UltraEdit puede trabajar con miles de archivos, no abrirlos en el editor. –

+0

Pregunta similar [aquí] (http: // stackoverflow.com/questions/102083/whats-the-best-tool-to-find-and-replace-regular-expressions-over-multiple-files) –

+0

Si siempre necesita esos archivos juntos, ¿no sería mejor crear un encabezado único que incluye lo que se necesita, en el orden necesario? Sería mejor si los encabezados se pueden incluir en cualquier orden, cada uno debe ser [autocontenido e idempotente] (http://stackoverflow.com/questions/1804486). Y recomendaría deshacerse de la notación ['../'](http://stackoverflow.com/questions/597318) también. –

Respuesta

9

sed hará lo que quiera.

Véase la entrada de la FAQ sobre exactamente esto aquí http://sed.sourceforge.net/sedfaq4.html#s4.23.3

Si tiene que coincidir con un bloque estático de texto (que puede ocurrir en cualquier número de veces a través de un archivo), donde el contenido de la bloque son conocidos en antelación, a continuación, este guión es fácil de usar

Sed está disponible para Windows. Ver http://gnuwin32.sourceforge.net/packages/sed.htm

+1

No estoy seguro de lo que estoy haciendo mal, pero cuando ejecuto el comando 'sed -nf blockrep.sed findrep.txt' para generar el archivo' custom.sed' obtengo el error 'sed: file blockrep.sed línea 18: 's' command 'sin terminación'. Al mirar la expresión regular en esa línea ('s, [/ \ [. *], \\ &, g') me parece correcta. –

0

Estoy bastante seguro de que una combinación de sed, awk y/o grep haría el trabajo. Son gratuitos y vienen con cualquier distribución de Linux, pero también existen versiones de Windows.

0

Siempre me siento perplejo cuando las personas piden herramientas sin decir para qué plataforma (s) las necesitan ...En estos casos, supongo que es, por defecto, para Windows ...

Existen varias herramientas de búsqueda/reemplazo disponibles para Windows, más o menos potentes, muchas de ellas gratuitas.
Actualmente, utilizo el módulo Buscar/Reemplazar de FileMenu Tools, sorprendentemente potente (puede usar expresiones regulares), y viene con muchas otras cosas.
También tengo Simple Search-Replace de RJL Soft (sin RE), autor de TortoiseSVN grepWin, que admite expresiones regulares y un buen número de opciones, y hay algunas otras que utilicé en el pasado.

PD .: Olvidé. Simple Search-Replace no reemplazará varias líneas. Ni herramientas de FileMenu, al parecer. grepWin puede hacer (usando \ r \ n por ejemplo). Recuerdo tales herramientas gratuitas con campos de búsqueda/reemplazo de líneas múltiples, pero no tengo sus nombres a mano.

+0

Otra respuesta obsoleta ... Los enlaces deben actualizarse. Una solución crossplatform sería buena – Sharcoux

+0

@Sharcoux Links? Solo el de FileMenu Tools lleva a una página 404, y si sube dos niveles en la URL, ¡encontrará el producto! Yo llamo a eso pereza ... Multiplataforma: try sed ... – PhiLho

+0

FileMenu Tools está obsoleto. sed está lejos de ser fácil de usar cuando se trata de multilínea. Simple Search-Replace no admite multilínea. Entonces, tal vez grepWin podría responder la pregunta. Admito que no lo intenté. Si solo le pones grepWin a tu respuesta, eliminaré mi voto negativo – Sharcoux

1

RegexSearch es un poco feo pero una herramienta muy útil para este tipo de cosas.

+0

No pude usarlo para reemplazar recursivamente en todos los archivos de un tipo dado. Recursivo no parece ser compatible. – codingdave

-1

Para una plataforma de Windows, puedo secundar la sugerencia UltraEdit-32 dada anteriormente - es una herramienta maravillosa, y bien vale la pena el dinero. Aparte de eso, creo que tu mejor opción será ser una pequeña secuencia de comandos perl, o bien awk/sed, nuevamente como se mencionó anteriormente.

+0

Es shareware – Sharcoux

1

La mejor herramienta que he encontrado es una pieza de freeware llamada BK ReplaceEm. La interfaz toma un tiempo para acostumbrarse, pero vale la pena aprender a usarla. La herramienta es muy poderosa y le permite hacer reemplazos multilínea con o sin expresiones regulares.

0
#see docs at the bottom 
use strict; 
use warnings; 
use Cwd; 

use File::Find; 

my $search_patternFilePath=$ARGV[0] ; 
my $replace_patternFilePath =$ARGV[1]; 
my $file_pattern = $ARGV[2]; 

# Usage 

(@ARGV == 3) || die ("Usage: FindAndReplace.pl pathToFileContaingTheMultiLineSearchText FullPathToFileContainingMultiLineReplaceText FilePattern . Example: perl MultiLineFindAndReplace.pl \"D:\Opera\New Folder\search.txt\" \"D:\Opera\replace.txt\" bak"); 



find(\&d, cwd); 

sub d { 
my $file = $File::Find::name; 
$file =~ s,/,\\,g; 

return unless -f $file; 
return unless $file =~ /$file_pattern/; 

my $searchPatternString = &slurpFile ($search_patternFilePath) ; 
my $replacePatternString = &slurpFile ($replace_patternFilePath) ; 
my $fileStr = &slurpFile ($file) ; 

$fileStr =~ s/$searchPatternString/$replacePatternString/igo ; 
open(FILEHANDLE,">$file") || die "cannot open output file"; 
print (FILEHANDLE "$fileStr"); 
close FILEHANDLE ; 

} 

sub slurpFile 
{ 
my $file = shift ; 
print "\$file is $file" ; 
local($/, *FILE) ; 
open (FILE , $file) or 
die "Cannot find $file !!! " ; 
my $fileString = <FILE>; #slurp the whole file into one string !!! 
close FILE ; 
return $fileString ; 
} 
#Purpose : performs recursive find and replace based on pеrl regexes from the current directory 
#the search and replace is case insensitive 
#Usage 
#perl MultiLineFindAndReplace.pl "D:\Opera\New Folder\search.txt" "D:\Opera\replace.txt" bak 
4
cd $PROJECTDIR && find . -iname '*.*' -exec vim -c 's:^first line of text\nsecond line of text\n3rd line of text:new 1st line\rnew 2nd\rnew 3rd:' -c 'w!' -c 'q' {} \; 

HTH

12

La familia de JetBrains IDE: IntelliJ, RubyMine, etc. PHPStorm va a hacer una búsqueda de varias líneas y reemplazar.

Seleccione el texto en cuestión y pulse ctrl-shift-F - se abrirá el diálogo Reemplazar con el texto seleccionado como la expresión hallazgo (usando una expresión regular con saltos de línea se escaparon como \n)

0

No estoy autorizado a comentar, pero la solución aceptada cita un ejemplo que parece roto. La línea 18 debe ser:

s,[/\.*[],\\&,g 

No

s,[/\[.*],\\&,g 

Este último se quejará con modernos sed (o 'GSED' si estás en * BSD) sobre una expresión sin terminar en la línea 18.

1

Lo único que funciona llave en mano es dreamweaver .... enter image description here

Cuestiones relacionadas