J'écris un script de fichier batch en utilisant l'environnement de ligne de commande Windows et je veux changer chaque occurrence d'un texte dans un fichier (ex. "FOO") par une autre (ex. "BAR"). Quelle est la manière la plus simple de procéder? Des fonctions intégrées?
492
echo(%text:%search%=%replace%%)
Réponses:
Beaucoup de réponses ici m'ont aidé à me diriger dans la bonne direction, mais aucune ne me convenait, donc je poste ma solution.
J'ai Windows 7, qui est livré avec PowerShell intégré. Voici le script que j'ai utilisé pour trouver / remplacer toutes les instances de texte dans un fichier:
Pour l'expliquer:
powershell
démarre powershell.exe, qui est inclus dans Windows 7-Command "... "
est un argument de ligne de commande pour powershell.exe contenant la commande à exécuter(gc myFile.txt)
lit le contenu demyFile.txt
(gc
est l'abréviation de laGet-Content
commande)-replace 'foo', 'bar'
exécute simplement la commande replace pour remplacerfoo
parbar
| Out-File myFile.txt
redirige la sortie vers le fichiermyFile.txt
-encoding ASCII
empêche la transcription du fichier de sortie en unicode, comme le soulignent les commentairesPowershell.exe devrait déjà faire partie de votre instruction PATH, mais sinon, vous pouvez l'ajouter. L'emplacement de celui-ci sur ma machine est
C:\WINDOWS\system32\WindowsPowerShell\v1.0
la source
-encoding ASCII
ouUTF8
ou tout ce qui est nécessaire. Attention également, si vous ciblez UTF8, il peut introduire une marque d'ordre d'octet au début du fichier qui n'apparaissait pas dans l'original.-encoding ASCII
. Pour quiconque en aurait besoin à l'avenir, ce seraitOut-File -encoding ASCII myFile.txt
Set-Content
au lieu deOut-File
.Si vous utilisez une version Windows qui prend en charge .Net 2.0, je remplacerais votre shell. PowerShell vous donne toute la puissance de .Net à partir de la ligne de commande. Il existe également de nombreux commandlets. L'exemple ci-dessous résoudra votre question. J'utilise les noms complets des commandes, il existe des alias plus courts, mais cela vous donne quelque chose pour Google.
la source
powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | sc myFile.txt"
FART vient d'être utilisé ( utilitaire de ligne de commande " F ind A et R eplace T ext"):
excellent petit freeware pour le remplacement de texte dans un grand ensemble de fichiers.
Les fichiers d'installation se trouvent sur SourceForge .
Exemple d'utilisation:
affichera un aperçu des remplacements à faire récursivement dans les fichiers de cette distribution Perl.
Seul problème: l'icône du site FART n'est pas exactement de bon goût, raffinée ou élégante;)
Mise à jour 2017 (7 ans plus tard) jagb le souligne dans les commentaires de l'article 2011 " FARTing the Easy Way - Find And Replace Text " de Mikail Tunç
la source
/
et'
comme cela ne fonctionne pas pour nous tous , pour moi, cela a fonctionné dans certains cas mais cela n'a pas fonctionné sur certains fichiers et je ne sais pas pourquoi .. J'ai utilisé cela pour remplacer du texte par un autre texte et un/
Remplacer - Remplacer une sous-chaîne à l'aide de la substitution de chaîne Description: pour remplacer une sous-chaîne par une autre chaîne, utilisez la fonction de substitution de chaîne. L'exemple présenté ici remplace toutes les occurrences "teh" des fautes d'orthographe par "the" dans la variable de chaîne str.
Sortie de script:
ref: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace
la source
Créez le fichier replace.vbs:
Pour utiliser ce script révisé (que nous appellerons replace.vbs), tapez simplement une commande similaire à celle-ci à partir de l'invite de commande:
cscript replace.vbs "C:\Scripts\Text.txt" "Jim " "James "
la source
RegExp
. Vous pouvez l' utiliser pour remplacer une expression régulière:With (New RegExp): strNewText = .Replace(strText, strOldText, strNewText): End With
. Vous pouvez obtenir le texte des 9 premiers groupes de capture à l' aide$1
,$2
...$9
.BatchSubstitute.bat
sur dostips.com est un exemple de recherche et de remplacement à l'aide d'un fichier batch pur.Il utilise une combinaison de
FOR
,FIND
etCALL SET
.Les lignes contenant des caractères parmi
"&<>]|^
peuvent être traitées incorrectement.la source
Remarque - Assurez-vous de voir la mise à jour à la fin de cette réponse pour un lien vers le JREPL.BAT supérieur qui remplace REPL.BAT
JREPL.BAT 7.0 et supérieur prend en charge nativement unicode (UTF-16LE) via l'
/UTF
option, ainsi que tout autre jeu de caractères, y compris UTF-8, via ADO !!!!J'ai écrit un petit utilitaire hybride JScript / batch appelé REPL.BAT qui est très pratique pour modifier des fichiers ASCII (ou ASCII étendu) via la ligne de commande ou un fichier batch. Le script purement natif ne nécessite l'installation d'aucun exécutable tiers et il fonctionne sur toute version Windows moderne à partir de XP. Il est également très rapide, en particulier par rapport aux solutions par lots pures.
REPL.BAT lit simplement stdin, effectue une recherche et un remplacement d'expression régulière JScript et écrit le résultat dans stdout.
Voici un exemple trivial de la façon de remplacer foo par bar dans test.txt, en supposant que REPL.BAT se trouve dans votre dossier actuel, ou mieux encore, quelque part dans votre PATH:
Les capacités d'expression régulière JScript le rendent très puissant, en particulier la capacité du texte de remplacement à référencer les sous-chaînes capturées à partir du texte de recherche.
J'ai inclus un certain nombre d'options dans l'utilitaire qui le rendent assez puissant. Par exemple, la combinaison des options
M
etX
permet la modification des fichiers binaires! L'M
option multiligne permet des recherches sur plusieurs lignes. L'X
option de modèle de substitution eXtended fournit des séquences d'échappement qui permettent l'inclusion de toute valeur binaire dans le texte de remplacement.L'utilitaire entier aurait pu être écrit en JScript pur, mais le fichier batch hybride élimine la nécessité de spécifier explicitement CSCRIPT chaque fois que vous souhaitez utiliser l'utilitaire.
Voici le script REPL.BAT. La documentation complète est intégrée au script.
MISE À JOUR IMPORTANTE
J'ai cessé de développer REPL.BAT et l'ai remplacé par JREPL.BAT. Ce nouvel utilitaire a toutes les mêmes fonctionnalités de REPL.BAT, et bien plus encore:
Comme toujours, une documentation complète est intégrée au script.
La solution triviale originale est maintenant encore plus simple:
La version actuelle de JREPL.BAT est disponible sur DosTips . Lisez tous les articles suivants dans le fil pour voir des exemples d'utilisation et un historique du développement.
la source
\q
représentation"
, et les littéraux de recherche prennent désormais en charge toutes les séquences d'échappement étendues lorsque les options L et X sont combinées.Utiliser FNR
Utilisez l'
fnr
utilitaire. Il a quelques avantages par rapport àfart
:Téléchargez FNR ici: http://findandreplace.io/?z=codeplex
Exemple d'utilisation:
fnr --cl --dir "<Directory Path>" --fileMask "hibernate.*" --useRegEx --find "find_str_expression" --replace "replace_string"
la source
Je ne pense pas qu'il existe un moyen de le faire avec des commandes intégrées. Je vous suggère de télécharger quelque chose comme Gnuwin32 ou UnxUtils et d'utiliser la
sed
commande (ou télécharger uniquementsed
):la source
sed -i -b -e 's/FOO/BAR/g' `find . -name *.txt`
-i - éditer le fichier sur place; -b - ne traite pas CR + LF - sans cette option, CR + LF serait converti en LFJe sais que je suis en retard à la fête ..
Personnellement, j'aime la solution chez: - http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace
Nous utilisons également largement la fonction de déduplication pour nous aider à envoyer quotidiennement environ 500 e-mails via SMTP à partir de: - https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/sj8IUhMOq6o
et ces deux fonctionnent en mode natif sans outils ou utilitaires supplémentaires nécessaires.
REMPLACER:
DÉDUPLICATEUR (notez l'utilisation de -9 pour un numéro ABA):
Merci!
la source
Lorsque vous travaillez avec Git sur Windows, lancez
git-bash
et utilisez simplementsed
. Ou, lorsque vous utilisez Windows 10, démarrez "Bash sur Ubuntu sur Windows" (à partir du sous-système Linux) et utilisezsed
.C'est un éditeur de flux, mais peut éditer des fichiers directement en utilisant la commande suivante:
-i
L'option est utilisée pour modifier en place sur le nom de fichier.-e
option indique une commande à exécuter.s
est utilisé pour remplacer l'expression trouvée "foo" par "bar" etg
est utilisé pour remplacer toutes les correspondances trouvées.Note d'ereOn:
Si vous souhaitez remplacer une chaîne dans les fichiers versionnés uniquement d'un référentiel Git, vous pouvez utiliser:
git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'
qui fait des merveilles.
la source
git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'
ce qui fonctionne à merveille.J'ai joué avec certaines des réponses existantes ici et préfère ma solution améliorée ...
ou si vous souhaitez enregistrer à nouveau la sortie dans un fichier ...
L'avantage de ceci est que vous pouvez diriger la sortie de n'importe quel programme. Va chercher à utiliser des expressions régulières avec cela aussi. Impossible de savoir comment en faire un fichier BAT pour une utilisation plus facile ... :-(
la source
type
signifie que toutes les lignes de plus de 80 caractères sont encapsulées. Quelle douleur.J'ai utilisé Perl, et cela fonctionne à merveille.
.orig est l'extension qu'il ajouterait au fichier d'origine
Pour un certain nombre de fichiers correspondant tels que * .html
la source
sed
parperl -pi.backup -e
et appréciez-le :)Avec le replacer.bat
1) Avec
e?
option qui évaluera les séquences de caractères spéciaux comme les\n\r
séquences unicode. Dans ce cas, remplacera le devis"Foo"
et"Bar"
:2) Remplacement simple là où le
Foo
etBar
ne sont pas cités.la source
Voici une solution que j'ai trouvée travaillé sur Win XP. Dans mon fichier de commandes en cours d'exécution, j'ai inclus les éléments suivants:
Le
replace.bat
fichier est comme ci-dessous. Je n'ai pas trouvé de moyen d'inclure cette fonction dans le même fichier de commandes, car la%%a
variable semble toujours donner la dernière valeur dans la boucle for.replace.bat
:la source
Jetez un oeil à Y at -il un utilitaire sed comme pour cmd.exe qui a demandé un équivalent sed sous Windows, devrait également s'appliquer à cette question. Résumé:
la source
Peut-être un peu en retard, mais je recherche souvent des choses similaires, car je ne veux pas passer par la douleur de faire approuver un logiciel.
Cependant, vous utilisez généralement l'instruction FOR sous différentes formes. Quelqu'un a créé un fichier de commandes utile qui effectue une recherche et un remplacement. Jetez un oeil ici . Il est important de comprendre les limites du fichier de commandes fourni. Pour cette raison, je ne copie pas le code source dans cette réponse.
la source
Deux fichiers batch qui fournissent des
search and replace
fonctions ont été écrits par les membres de Stack Overflowdbenham
etaacini
utilisésnative built-in jscript
dans Windows.Ils sont à la fois
robust
etvery swift with large files
comparés aux scripts batch simples, et égalementsimpler
à utiliser pour le remplacement de base du texte. Ils ont tous deux uneWindows regular expression
correspondance de motifs.Ce
sed-like
fichier batch d'aide est appelérepl.bat
(par dbenham).Exemple d'utilisation du
L
commutateur littéral:Ce
grep-like
fichier batch d'aide est appeléfindrepl.bat
(par aacini).Exemple avec des expressions régulières actives:
Les deux deviennent de puissants utilitaires à l'échelle du système
when placed in a folder that is on the path
ou peuvent être utilisés dans le même dossier avec un fichier de commandes ou à partir de l'invite cmd.Ils ont tous deux des
case-insensitive
commutateurs et de nombreuses autres fonctions.la source
La commande Power Shell fonctionne comme un charme
la source
Je viens de faire face à un problème similaire - "Rechercher et remplacer du texte dans des fichiers", mais à l'exception que pour les noms de fichiers et la recherche / réparation, je dois utiliser l'expression régulière. Parce que je ne suis pas familier avec Powershell et que je souhaite enregistrer mes recherches pour une utilisation ultérieure, j'ai besoin de quelque chose de plus "convivial" (préférable s'il a une interface graphique).
Donc, pendant la recherche sur Google :), j'ai trouvé un excellent outil - FAR (Find And Replace) (pas FART).
Ce petit programme possède une interface graphique agréable et prend en charge l'expression régulière pour la recherche dans les noms de fichiers et dans les fichiers. Le seul inconvénient est que si vous souhaitez enregistrer vos paramètres, vous devez exécuter le programme en tant qu'administrateur (au moins sur Win7).
la source
Je préfère utiliser
sed
d' utilitaires GNU pour Win32 , les points suivants doivent noterDonc, le code de travail
sed
pour rechercher et remplacer du texte dans un fichier dans Windows est comme ci-dessousla source
-i
! Si votre version sed le fait, vérifiez la commande à partir de cette réponse: stackoverflow.com/a/33762001/2492801 .C'est une chose que les scripts batch ne font tout simplement pas bien.
Le script morechilli lié à fonctionnera pour certains fichiers, mais malheureusement il s'étouffera avec ceux qui contiennent des caractères tels que des tuyaux et des esperluettes.
VBScript est un meilleur outil intégré pour cette tâche. Voir cet article pour un exemple: http://www.microsoft.com/technet/scriptcenter/resources/qanda/feb05/hey0208.mspx
la source
@Rachel a donné une excellente réponse, mais en voici une variante pour lire le contenu d'une
$data
variable PowerShell . Vous pouvez ensuite manipuler facilement le contenu plusieurs fois avant d'écrire dans un fichier de sortie. Voir également comment les valeurs multilignes sont données dans un fichier batch .bat.la source
Utilisez PowerShell dans .bat - pour Windows 7+
l'encodage utf8 est facultatif, bon pour les sites Web
la source
Téléchargez Cygwin (gratuit) et utilisez des commandes de type Unix sur la ligne de commande Windows.
Votre meilleur pari: sed
la source
Peut également voir les outils Replace et ReplaceFilter sur https://zoomicon.github.io/tranXform/ (source incluse). Le 2ème est un filtre.
L'outil qui remplace les chaînes dans les fichiers est en VBScript (nécessite Windows Script Host [WSH] pour s'exécuter dans les anciennes versions de Windows)
Le filtre ne fonctionne probablement pas avec Unicode, sauf si vous recompilez avec la dernière version de Delphi (ou avec FreePascal / Lazarus)
la source
J'ai rencontré ce problème plusieurs fois lors du codage sous Visual C ++. Si vous l'avez, vous pouvez utiliser l'utilitaire Visual Studio Find and Replace. Il vous permet de sélectionner un dossier et de remplacer le contenu de tout fichier de ce dossier par tout autre texte de votre choix.
Sous Visual Studio: Édition -> Rechercher et remplacer Dans la boîte de dialogue ouverte, sélectionnez votre dossier et remplissez les cases "Rechercher quoi" et "Remplacer par". J'espère que cela vous sera utile.
la source