22 votes

Outil de recherche et de remplacement multi-lignes

Je recherche un outil pour remplacer plusieurs lignes dans tout un projet. Par exemple:

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

avec

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

J'ai essayé deux outils qui fonctionnent pour ce type de recherche et de remplacement. Wildedit et Actual search and replace Les deux semblent être d'excellents outils mais ce sont des sharewares. Est-ce que quelqu'un connaît des outils similaires? Est-ce gratuit ou est-il temps de dépenser de l'argent?

Clarification:

à travers tout un projet dans ce cas signifie plus d'un millier de fichiers c. Les éditeurs de texte ne peuvent le faire que fichier par fichier (Textpad, Programmers Notepad) ou dans tous les fichiers ouverts (nodepad++). Je n'ai pas essayé d'autres éditeurs mais je suppose qu'ils auront des problèmes similaires. Veuillez me corriger si je me trompe.

Des outils comme sed & awk sont une solution mais posent des problèmes car je ne les utilise pas régulièrement et j'ai besoin de passer du temps pour arriver à quelque chose qui fonctionne car je ne suis pas un expert des outils.

La réponse est: Tout cela...

Ultra Edit peut fonctionner mais j'ai déjà un éditeur et le prix est élevé si je vais juste l'utiliser comme outil de recherche et de remplacement.

Sed, AWK et d'autres outils basés sur les expressions régulières peuvent fonctionner mais peuvent être pénibles dans certains cas.

Wild Edit peut fonctionner et n'est pas si cher.

Ma décision finale est de travailler mes compétences en expressions régulières.

0voto

Je suis assez sûr qu'une combinaison de sed, awk et/ou grep ferait l'affaire. Ils sont gratuits et viennent avec n'importe quelle distribution Linux, mais des versions Windows existent également.

0voto

PhiLho Points 23458

Je suis toujours perplexe quand les gens demandent des outils sans préciser pour quelle(s) plateforme(s) ils en ont besoin... Dans ces cas, je suppose que c'est, par défaut, pour Windows...

Il existe un certain nombre d'outils de recherche/remplacement disponibles pour Windows, plus ou moins puissants, beaucoup d'entre eux gratuits.
Actuellement, j'utilise le module Recherche/Remplacement de FileMenu Tools, étonnamment puissant (vous pouvez utiliser des expressions régulières), accompagné de nombreuses autres fonctionnalités.
J'ai aussi Simple Search-Replace de RJL Soft (pas d'expressions régulières), le grepWin de l'auteur de TortoiseSVN, prenant en charge les regex et un bon nombre d'options, et il y en a d'autres que j'ai utilisés par le passé.

PS. : J'ai oublié. Simple Search-Replace ne fera pas de remplacements multi-lignes. Apparemment, FileMenu Tools non plus. grepWin peut le faire (en utilisant \r\n par exemple). Je me souviens d'outils gratuits de ce type avec des champs de recherche/remplacement multi-lignes, mais je n'ai pas leur nom sous la main.

0voto

Lokkju Points 1872

Pour une plateforme Windows, je peux approuver la suggestion d'UltraEdit-32 mentionnée ci-dessus - c'est un outil merveilleux et qui vaut bien son prix. Sinon, je pense que votre meilleure option sera soit un petit script perl, soit awk/sed, comme mentionné précédemment.

0voto

YordanGeorgiev Points 1222
#voir la documentation en bas
use strict;
use warnings;
use Cwd;

use File::Find;

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

# Utilisation

(@ARGV == 3 ) || die ("Utilisation: FindAndReplace.pl cheminVersLeFichierContenantLeTexteDeRechercheMultiligne cheminCompletVersLeFichierContenantLeTexteDeRemplacementMultiligne MotifDeFichier . Exemple: perl MultiLineFindAndReplace.pl \"D:\Opera\Nouveau dossier\search.txt\" \"D:\Opera\remplacer.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 "ne peut pas ouvrir le fichier de sortie";
print (FILEHANDLE "$fileStr");
close FILEHANDLE ;

}

sub slurpFile 
{
my $file = shift ;
print "\$file est $file" ;
local( $/, *FILE ) ; 
open (FILE , $file) or 
die "Impossible de trouver $file !!! " ; 
my $fileString = ; #lire tout le fichier dans une seule chaîne !!! 
close FILE ;
return $fileString ;
}
#Objectif : effectue une recherche et un remplacement récursifs basés sur des regex pеrl depuis le répertoire courant
#la recherche et le remplacement ne sont pas sensibles à la casse
#Utilisation
#perl MultiLineFindAndReplace.pl "D:\Opera\Nouveau dossier\search.txt" "D:\Opera\remplacer.txt" bak

0voto

Chris S Points 32376

J'ai écrit cet outil en ligne pour le faire, mais c'est en Silverlight.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X