web-dev-qa-db-fra.com

Rechercher et remplacer plusieurs valeurs différentes en même temps

J'ai un fichier avec plusieurs instances de Text_1 et Text1 et je dois remplacer ces deux chaînes par Text_A et TextB respectivement.

Actuellement, je suis en train de faire deux fonctions de recherche et de remplacement sur chaque fichier: un qui trouve Text_1 et le remplace par Text_A et l'autre qui trouve Text1 et le remplace par TextB.

Y a-t-il un moyen de faire tout cela en même temps au lieu d'avoir à exécuter "Rechercher et remplacer" deux fois?

J'utilise Dreamweaver CS3, mais j'ai également Notepad ++, un bloc-notes régulier, OO Writer, MS Word si ce sera plus facile. Idéalement, je pourrais le faire dans Dreamweaver ou Notepad ++, mais je suis prêt à télécharger quelque chose d'autre pour faire le travail. Je préférerais ne pas avoir à faire de commandes en ligne de commande ou à créer un fichier de commandes (même si je suis au courant, je ne le comprends pas vraiment).

Dans le cas où la description ci-dessus n'est pas claire, laissez-moi l'expliquer de cette façon ...

Je veux lancer la recherche et le remplacement 1 fois dans 1 document et I veux le faire TOUS parmi les actions suivantes au cours de cette instance Find & Replace:

  1. Rechercher Text_1 et Remplacer par Text_A
  2. Rechercher Text1 et Remplacer par TextB

Je n'essaie pas de rechercher et de remplacer plusieurs documents.

14
matt

Jetez un coup d'oeil à Sed . Vous pouvez facilement atteindre votre objectif en une seule ligne de commande

sed -e "s/Text_1/TextA/" -e "s/Text1/TextB/" <your_file.txt>your_file_new.txt

10
Tuan Anh Hoang-Vu

Depuis Notepad ++ 6.0, il est en fait possible sans scripts en utilisant la technique suivante:

Rechercher: Text_1 et remplacer par: Text_A

Rechercher: Text2 et remplacer par: TextB

Rechercher: (Texte_1) | (Texte2)

Remplacer: (? 1Text_A) (? 2TextB)

La syntaxe générale est la suivante:

Find: (FindA)|(FindB)|(FindC)...

Replace: (?1ReplaceA)(?2ReplaceB)(?3ReplaceC)...

? 1 fait référence à la première phrase capturée et ainsi de suite.

La réponse suivante m'a donné ceci: https://stackoverflow.com/a/16104946/287101

22
rakaloof

En utilisant Notepad ++, vous pouvez soit

  • Ouvrez tous les fichiers contenant les mots que vous souhaitez remplacer et utilisez Rechercher/Remplacer dans tous les fichiers ouverts.

    enter image description here

  • Utiliser Rechercher/Remplacer dans les fichiers

    enter image description here

  • Enregistrez une macro en effectuant les options de recherche et de remplacement et lisez-la

3
Sathyajith Bhat

Vous feriez mieux de lancer deux fois Trouver et Remplacer, car deux remplacements différents sont en cours. Cependant, il devrait y avoir très peu de compromis en termes de temps de traitement. Considérer ce qui suit:

Lancer Trouver et remplacer une fois, en cherchant terme par terme:

Get Term
  Does term match?  If so, replace term
Get Next Term
...

Pour des raisons d'exécution, supposons que c'est linéaire et disons que cela s'exécute en O(n) temps.

Vous voulez trouver deux termes différents. Lancer deux fois Rechercher & Remplacer ressemble à ceci:

Get Term
  Does term match?  If so, replace term
Get Next Term
...

Get Term
  Does term match?  If so, replace term
Get Next Term
...

ce qui prendrait O(2x1n) temps, ou deux fois plus longtemps que la recherche d'un terme.

La recherche de deux termes avec deux remplacements ressemblerait théoriquement à:

Get Term
  Does first term match?  If so, replace first term
  Does second term match?  If so, replace second term
Get Next Term
...

Obtenir les termes ne nécessite pas beaucoup de puissance de traitement, vous devez donc essentiellement rechercher deux ensembles de recherches pour chaque terme, donnant un temps égal à O (1x2n), qui s'exécute une fois mais qui recherche deux termes.

Bien que vous épargniez du temps en ne chargeant pas chaque terme deux fois, vous passeriez plus de temps à chercher chaque terme deux fois. Il y a donc peu de compromis. Et puisque cette fonctionnalité serait utilisée moins souvent que la recherche d'un terme avec un remplacement, les développeurs d'applications supposent simplement ne pas écrire. cette fonctionnalité.

AVERTISSEMENT AUX PROGRAMMATEURS: Ceci est un exemple généralisé. Je sais que c'est mieux, mais j'essaie de montrer pourquoi cette fonctionnalité n'a pas été trouvée.

2
Theo

J'utilise TextCrawler pour rechercher et remplacer par lots. (J'utilise Notepad ++ pour une recherche/remplacement unique sur plusieurs fichiers, car il est plus rapide que Textcrawler.) TextCrawler prend en charge les expressions régulières ainsi que la recherche/recherche normale. Les fichiers de commandes peuvent être enregistrés et rechargés pour une utilisation ultérieure.

0
Chris

En outre, cela peut être fait en utilisant ActiveX Plugin (for Notepad ++) et en exécutant un script personnalisé:

NppApplication.activeEditor.text
=NppApplication.activeEditor.text
.replace(/Text_1/g,"Text_A")
.replace(/Text1/g,"TextB")
0
valeryan

Le support des expressions régulières dans Notepad ++ est sévèrement limité. Sans l'opérateur d'alternance, vous ne pouvez même pas vous rapprocher de ce que vous voulez faire. Vous devrez utiliser sed ou un éditeur qui prend mieux en charge les regex.

Les extensions GNU de la syntaxe d'expression régulière couramment utilisées incluent:

  • la ? opérateur, signifiant zéro ou unique;
  • le | opérateur d'alternance ("foo | bar" correspond à "foo" ou "bar")
  • des modificateurs tels que/g pour glouton ou/i pour insensible à la casse;
  • {a, b} pour indiquer entre les jetons d'un genre et d'un b.
  • (motif) + pour machiner une ou plusieurs correspondances du même motif

Le composant Scitilla, qui sous-tend Notepad ++, est strictement compatible POSIX et ne reconnaît pas ces extensions. Vous pouvez consulter les expressions régulières pour un récapitulatif complet et quelques exemples.

Source

Voir aussi

GNUWin32 sed pour Windows

0
Dennis Williamson