Comment rechercher et remplacer du texte dans un fichier à l’aide de l’environnement de ligne de commande Windows ?

StackOverflow https://stackoverflow.com/questions/60034

Question

J'écris un script de fichier batch en utilisant l'environnement de ligne de commande Windows et je souhaite modifier chaque occurrence de texte dans un fichier (ex."FOO") avec un autre (ex."BAR").Quelle est la manière la plus simple de procéder ?Des fonctions intégrées ?

Était-ce utile?

La solution

De nombreuses réponses ici m'ont aidé à orienter dans la bonne direction, mais aucune ne me convenait, je publie donc ma solution.

J'ai Windows 7, qui est livré avec PowerShell intégré.Voici le script que j'ai utilisé pour rechercher/remplacer toutes les instances de texte dans un fichier :

powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | Out-File myFile.txt"

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 de myFile.txt (gc est l'abréviation de Get-Content commande)
  • -replace 'foo', 'bar' exécute simplement la commande replace pour remplacer foo avec bar
  • | Out-File myFile.txt dirige la sortie vers le fichier myFile.txt

Powershell.exe devrait déjà faire partie de votre instruction PATH, mais sinon, vous pouvez l'ajouter.Son emplacement sur ma machine est C:\WINDOWS\system32\WindowsPowerShell\v1.0

Autres conseils

Si vous utilisez une version Windows prenant en charge .Net 2.0, je remplacerais votre shell. PowerShell vous donne toute la puissance de .Net depuis la ligne de commande.De nombreuses commandes sont également intégrées.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 à Google.

(Get-Content test.txt) | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt

Je viens d'utiliser PET ("F Indiana UN sd R. remplacer T ext" utilitaire de ligne de commande) :
excellent petit logiciel gratuit pour le remplacement de texte dans un grand ensemble de fichiers.

Les fichiers d'installation sont sur SourceForge.

Exemple d'utilisation :

fart.exe -p -r -c -- C:\tools\perl-5.8.9\* @@APP_DIR@@ C:\tools

prévisualisera les remplacements à faire de manière récursive dans les fichiers de cette distribution Perl.

Seul problème :l'icône du site FART n'est pas vraiment de bon goût, raffinée ou élégante ;)


Mise à jour 2017 (7 ans plus tard) jab fait remarquer dans les commentaires à l'article de 2011 "FARTing the Easy Way – Rechercher et remplacer du texte" depuis Mikail Tunç

Remplacer - Remplacez 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 de "teh" mal orthographiées par "the" dans la variable chaîne str.

set str=teh cat in teh hat
echo.%str%
set str=%str:teh=the%
echo.%str%

Sortie du script :

teh cat in teh hat
the cat in the hat

réf: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace

Créez le fichier remplacer.vbs :

Const ForReading = 1    
Const ForWriting = 2

strFileName = Wscript.Arguments(0)
strOldText = Wscript.Arguments(1)
strNewText = Wscript.Arguments(2)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFileName, ForReading)
strText = objFile.ReadAll
objFile.Close

strNewText = Replace(strText, strOldText, strNewText)
Set objFile = objFSO.OpenTextFile(strFileName, ForWriting)
objFile.Write strNewText  'WriteLine adds extra CR/LF
objFile.Close

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 "

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 et CALL SET.

Lignes contenant des caractères parmi "&<>]|^ peut être mal traité.


Note - 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 l'Unicode (UTF-16LE) via le /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 c'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 n'importe quelle version moderne de Windows à partir de XP.C’est également très rapide, surtout par rapport aux solutions discontinues pures.

REPL.BAT lit simplement stdin, effectue une recherche et un remplacement d'expression régulière JScript et écrit le résultat sur 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 :

type test.txt|repl "foo" "bar" >test.txt.new
move /y test.txt.new test.txt

Les capacités d'expression régulière de 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 recherché.

J'ai inclus un certain nombre d'options dans l'utilitaire qui le rendent assez puissant.Par exemple, combiner le M et X les options permettent la modification des fichiers binaires !Le M L'option multiligne permet des recherches sur plusieurs lignes.Le X L'option de modèle de substitution étendue fournit des séquences d'échappement qui permettent l'inclusion de n'importe quelle valeur binaire dans le texte de remplacement.

L'ensemble de l'utilitaire aurait pu être écrit en JScript pur, mais le fichier de commandes hybride élimine le besoin 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.

@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment

::************ Documentation ***********
::REPL.BAT version 6.2
:::
:::REPL  Search  Replace  [Options  [SourceVar]]
:::REPL  /?[REGEX|REPLACE]
:::REPL  /V
:::
:::  Performs a global regular expression search and replace operation on
:::  each line of input from stdin and prints the result to stdout.
:::
:::  Each parameter may be optionally enclosed by double quotes. The double
:::  quotes are not considered part of the argument. The quotes are required
:::  if the parameter contains a batch token delimiter like space, tab, comma,
:::  semicolon. The quotes should also be used if the argument contains a
:::  batch special character like &, |, etc. so that the special character
:::  does not need to be escaped with ^.
:::
:::  If called with a single argument of /?, then prints help documentation
:::  to stdout. If a single argument of /?REGEX, then opens up Microsoft's
:::  JScript regular expression documentation within your browser. If a single
:::  argument of /?REPLACE, then opens up Microsoft's JScript REPLACE
:::  documentation within your browser.
:::
:::  If called with a single argument of /V, case insensitive, then prints
:::  the version of REPL.BAT.
:::
:::  Search  - By default, this is a case sensitive JScript (ECMA) regular
:::            expression expressed as a string.
:::
:::            JScript regex syntax documentation is available at
:::            http://msdn.microsoft.com/en-us/library/ae5bf541(v=vs.80).aspx
:::
:::  Replace - By default, this is the string to be used as a replacement for
:::            each found search expression. Full support is provided for
:::            substituion patterns available to the JScript replace method.
:::
:::            For example, $& represents the portion of the source that matched
:::            the entire search pattern, $1 represents the first captured
:::            submatch, $2 the second captured submatch, etc. A $ literal
:::            can be escaped as $$.
:::
:::            An empty replacement string must be represented as "".
:::
:::            Replace substitution pattern syntax is fully documented at
:::            http://msdn.microsoft.com/en-US/library/efy6s3e6(v=vs.80).aspx
:::
:::  Options - An optional string of characters used to alter the behavior
:::            of REPL. The option characters are case insensitive, and may
:::            appear in any order.
:::
:::            A - Only print altered lines. Unaltered lines are discarded.
:::                If the S options is present, then prints the result only if
:::                there was a change anywhere in the string. The A option is
:::                incompatible with the M option unless the S option is present.
:::
:::            B - The Search must match the beginning of a line.
:::                Mostly used with literal searches.
:::
:::            E - The Search must match the end of a line.
:::                Mostly used with literal searches.
:::
:::            I - Makes the search case-insensitive.
:::
:::            J - The Replace argument represents a JScript expression.
:::                The expression may access an array like arguments object
:::                named $. However, $ is not a true array object.
:::
:::                The $.length property contains the total number of arguments
:::                available. The $.length value is equal to n+3, where n is the
:::                number of capturing left parentheses within the Search string.
:::
:::                $[0] is the substring that matched the Search,
:::                $[1] through $[n] are the captured submatch strings,
:::                $[n+1] is the offset where the match occurred, and
:::                $[n+2] is the original source string.
:::
:::                Arguments $[0] through $[10] may be abbreviated as
:::                $1 through $10. Argument $[11] and above must use the square
:::                bracket notation.
:::
:::            L - The Search is treated as a string literal instead of a
:::                regular expression. Also, all $ found in the Replace string
:::                are treated as $ literals.
:::
:::            M - Multi-line mode. The entire contents of stdin is read and
:::                processed in one pass instead of line by line, thus enabling
:::                search for \n. This also enables preservation of the original
:::                line terminators. If the M option is not present, then every
:::                printed line is terminated with carriage return and line feed.
:::                The M option is incompatible with the A option unless the S
:::                option is also present.
:::
:::                Note: If working with binary data containing NULL bytes,
:::                      then the M option must be used.
:::
:::            S - The source is read from an environment variable instead of
:::                from stdin. The name of the source environment variable is
:::                specified in the next argument after the option string. Without
:::                the M option, ^ anchors the beginning of the string, and $ the
:::                end of the string. With the M option, ^ anchors the beginning
:::                of a line, and $ the end of a line.
:::
:::            V - Search and Replace represent the name of environment
:::                variables that contain the respective values. An undefined
:::                variable is treated as an empty string.
:::
:::            X - Enables extended substitution pattern syntax with support
:::                for the following escape sequences within the Replace string:
:::
:::                \\     -  Backslash
:::                \b     -  Backspace
:::                \f     -  Formfeed
:::                \n     -  Newline
:::                \q     -  Quote
:::                \r     -  Carriage Return
:::                \t     -  Horizontal Tab
:::                \v     -  Vertical Tab
:::                \xnn   -  Extended ASCII byte code expressed as 2 hex digits
:::                \unnnn -  Unicode character expressed as 4 hex digits
:::
:::                Also enables the \q escape sequence for the Search string.
:::                The other escape sequences are already standard for a regular
:::                expression Search string.
:::
:::                Also modifies the behavior of \xnn in the Search string to work
:::                properly with extended ASCII byte codes.
:::
:::                Extended escape sequences are supported even when the L option
:::                is used. Both Search and Replace support all of the extended
:::                escape sequences if both the X and L opions are combined.
:::
:::  Return Codes:  0 = At least one change was made
:::                     or the /? or /V option was used
:::
:::                 1 = No change was made
:::
:::                 2 = Invalid call syntax or incompatible options
:::
:::                 3 = JScript runtime error, typically due to invalid regex
:::
::: REPL.BAT was written by Dave Benham, with assistance from DosTips user Aacini
::: to get \xnn to work properly with extended ASCII byte codes. Also assistance
::: from DosTips user penpen diagnosing issues reading NULL bytes, along with a
::: workaround. REPL.BAT was originally posted at:
::: http://www.dostips.com/forum/viewtopic.php?f=3&t=3855
:::

::************ Batch portion ***********
@echo off
if .%2 equ . (
  if "%~1" equ "/?" (
    <"%~f0" cscript //E:JScript //nologo "%~f0" "^:::" "" a
    exit /b 0
  ) else if /i "%~1" equ "/?regex" (
    explorer "http://msdn.microsoft.com/en-us/library/ae5bf541(v=vs.80).aspx"
    exit /b 0
  ) else if /i "%~1" equ "/?replace" (
    explorer "http://msdn.microsoft.com/en-US/library/efy6s3e6(v=vs.80).aspx"
    exit /b 0
  ) else if /i "%~1" equ "/V" (
    <"%~f0" cscript //E:JScript //nologo "%~f0" "^::(REPL\.BAT version)" "$1" a
    exit /b 0
  ) else (
    call :err "Insufficient arguments"
    exit /b 2
  )
)
echo(%~3|findstr /i "[^SMILEBVXAJ]" >nul && (
  call :err "Invalid option(s)"
  exit /b 2
)
echo(%~3|findstr /i "M"|findstr /i "A"|findstr /vi "S" >nul && (
  call :err "Incompatible options"
  exit /b 2
)
cscript //E:JScript //nologo "%~f0" %*
exit /b %errorlevel%

:err
>&2 echo ERROR: %~1. Use REPL /? to get help.
exit /b

************* JScript portion **********/
var rtn=1;
try {
  var env=WScript.CreateObject("WScript.Shell").Environment("Process");
  var args=WScript.Arguments;
  var search=args.Item(0);
  var replace=args.Item(1);
  var options="g";
  if (args.length>2) options+=args.Item(2).toLowerCase();
  var multi=(options.indexOf("m")>=0);
  var alterations=(options.indexOf("a")>=0);
  if (alterations) options=options.replace(/a/g,"");
  var srcVar=(options.indexOf("s")>=0);
  if (srcVar) options=options.replace(/s/g,"");
  var jexpr=(options.indexOf("j")>=0);
  if (jexpr) options=options.replace(/j/g,"");
  if (options.indexOf("v")>=0) {
    options=options.replace(/v/g,"");
    search=env(search);
    replace=env(replace);
  }
  if (options.indexOf("x")>=0) {
    options=options.replace(/x/g,"");
    if (!jexpr) {
      replace=replace.replace(/\\\\/g,"\\B");
      replace=replace.replace(/\\q/g,"\"");
      replace=replace.replace(/\\x80/g,"\\u20AC");
      replace=replace.replace(/\\x82/g,"\\u201A");
      replace=replace.replace(/\\x83/g,"\\u0192");
      replace=replace.replace(/\\x84/g,"\\u201E");
      replace=replace.replace(/\\x85/g,"\\u2026");
      replace=replace.replace(/\\x86/g,"\\u2020");
      replace=replace.replace(/\\x87/g,"\\u2021");
      replace=replace.replace(/\\x88/g,"\\u02C6");
      replace=replace.replace(/\\x89/g,"\\u2030");
      replace=replace.replace(/\\x8[aA]/g,"\\u0160");
      replace=replace.replace(/\\x8[bB]/g,"\\u2039");
      replace=replace.replace(/\\x8[cC]/g,"\\u0152");
      replace=replace.replace(/\\x8[eE]/g,"\\u017D");
      replace=replace.replace(/\\x91/g,"\\u2018");
      replace=replace.replace(/\\x92/g,"\\u2019");
      replace=replace.replace(/\\x93/g,"\\u201C");
      replace=replace.replace(/\\x94/g,"\\u201D");
      replace=replace.replace(/\\x95/g,"\\u2022");
      replace=replace.replace(/\\x96/g,"\\u2013");
      replace=replace.replace(/\\x97/g,"\\u2014");
      replace=replace.replace(/\\x98/g,"\\u02DC");
      replace=replace.replace(/\\x99/g,"\\u2122");
      replace=replace.replace(/\\x9[aA]/g,"\\u0161");
      replace=replace.replace(/\\x9[bB]/g,"\\u203A");
      replace=replace.replace(/\\x9[cC]/g,"\\u0153");
      replace=replace.replace(/\\x9[dD]/g,"\\u009D");
      replace=replace.replace(/\\x9[eE]/g,"\\u017E");
      replace=replace.replace(/\\x9[fF]/g,"\\u0178");
      replace=replace.replace(/\\b/g,"\b");
      replace=replace.replace(/\\f/g,"\f");
      replace=replace.replace(/\\n/g,"\n");
      replace=replace.replace(/\\r/g,"\r");
      replace=replace.replace(/\\t/g,"\t");
      replace=replace.replace(/\\v/g,"\v");
      replace=replace.replace(/\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}/g,
        function($0,$1,$2){
          return String.fromCharCode(parseInt("0x"+$0.substring(2)));
        }
      );
      replace=replace.replace(/\\B/g,"\\");
    }
    search=search.replace(/\\\\/g,"\\B");
    search=search.replace(/\\q/g,"\"");
    search=search.replace(/\\x80/g,"\\u20AC");
    search=search.replace(/\\x82/g,"\\u201A");
    search=search.replace(/\\x83/g,"\\u0192");
    search=search.replace(/\\x84/g,"\\u201E");
    search=search.replace(/\\x85/g,"\\u2026");
    search=search.replace(/\\x86/g,"\\u2020");
    search=search.replace(/\\x87/g,"\\u2021");
    search=search.replace(/\\x88/g,"\\u02C6");
    search=search.replace(/\\x89/g,"\\u2030");
    search=search.replace(/\\x8[aA]/g,"\\u0160");
    search=search.replace(/\\x8[bB]/g,"\\u2039");
    search=search.replace(/\\x8[cC]/g,"\\u0152");
    search=search.replace(/\\x8[eE]/g,"\\u017D");
    search=search.replace(/\\x91/g,"\\u2018");
    search=search.replace(/\\x92/g,"\\u2019");
    search=search.replace(/\\x93/g,"\\u201C");
    search=search.replace(/\\x94/g,"\\u201D");
    search=search.replace(/\\x95/g,"\\u2022");
    search=search.replace(/\\x96/g,"\\u2013");
    search=search.replace(/\\x97/g,"\\u2014");
    search=search.replace(/\\x98/g,"\\u02DC");
    search=search.replace(/\\x99/g,"\\u2122");
    search=search.replace(/\\x9[aA]/g,"\\u0161");
    search=search.replace(/\\x9[bB]/g,"\\u203A");
    search=search.replace(/\\x9[cC]/g,"\\u0153");
    search=search.replace(/\\x9[dD]/g,"\\u009D");
    search=search.replace(/\\x9[eE]/g,"\\u017E");
    search=search.replace(/\\x9[fF]/g,"\\u0178");
    if (options.indexOf("l")>=0) {
      search=search.replace(/\\b/g,"\b");
      search=search.replace(/\\f/g,"\f");
      search=search.replace(/\\n/g,"\n");
      search=search.replace(/\\r/g,"\r");
      search=search.replace(/\\t/g,"\t");
      search=search.replace(/\\v/g,"\v");
      search=search.replace(/\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}/g,
        function($0,$1,$2){
          return String.fromCharCode(parseInt("0x"+$0.substring(2)));
        }
      );
      search=search.replace(/\\B/g,"\\");
    } else search=search.replace(/\\B/g,"\\\\");
  }
  if (options.indexOf("l")>=0) {
    options=options.replace(/l/g,"");
    search=search.replace(/([.^$*+?()[{\\|])/g,"\\$1");
    if (!jexpr) replace=replace.replace(/\$/g,"$$$$");
  }
  if (options.indexOf("b")>=0) {
    options=options.replace(/b/g,"");
    search="^"+search
  }
  if (options.indexOf("e")>=0) {
    options=options.replace(/e/g,"");
    search=search+"$"
  }
  var search=new RegExp(search,options);
  var str1, str2;

  if (srcVar) {
    str1=env(args.Item(3));
    str2=str1.replace(search,jexpr?replFunc:replace);
    if (!alterations || str1!=str2) if (multi) {
      WScript.Stdout.Write(str2);
    } else {
      WScript.Stdout.WriteLine(str2);
    }
    if (str1!=str2) rtn=0;
  } else if (multi){
    var buf=1024;
    str1="";
    while (!WScript.StdIn.AtEndOfStream) {
      str1+=WScript.StdIn.Read(buf);
      buf*=2
    }
    str2=str1.replace(search,jexpr?replFunc:replace);
    WScript.Stdout.Write(str2);
    if (str1!=str2) rtn=0;
  } else {
    while (!WScript.StdIn.AtEndOfStream) {
      str1=WScript.StdIn.ReadLine();
      str2=str1.replace(search,jexpr?replFunc:replace);
      if (!alterations || str1!=str2) WScript.Stdout.WriteLine(str2);
      if (str1!=str2) rtn=0;
    }
  }
} catch(e) {
  WScript.Stderr.WriteLine("JScript runtime error: "+e.message);
  rtn=3;
}
WScript.Quit(rtn);

function replFunc($0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $10) {
  var $=arguments;
  return(eval(replace));
}


MISE À JOUR IMPORTANTE

J'ai arrêté le développement de REPL.BAT et l'ai remplacé par JREPL.BAT.Cet utilitaire plus récent possède les mêmes fonctionnalités que REPL.BAT, et bien plus encore :

  • Prise en charge d'Unicode UTF-16LE via les capacités Unicode CSCRIPT natives et de tout autre jeu de caractères (y compris UTF-8) via ADO.
  • Lire directement depuis/écrire directement dans un fichier :pas besoin de tuyaux, de redirection ou de commande de déplacement.
  • Incorporer le JScript fourni par l'utilisateur
  • Fonction de traduction similaire à Unix tr, mais elle prend également en charge la recherche d'expressions régulières et le remplacement de JScript
  • Supprimer le texte qui ne correspond pas
  • Préfixer les lignes de sortie avec le numéro de ligne
  • et plus...

Comme toujours, une documentation complète est intégrée au script.

La solution triviale originale est désormais encore plus simple :

jrepl "foo" "bar" /f test.txt /o -

La version actuelle de JREPL.BAT est disponible sur DosTips.Lisez tous les articles suivants dans le fil de discussion pour voir des exemples d'utilisation et un historique du développement.

Utiliser FNR

Utilisez le fnr utilitaire.Il présente certains avantages par rapport fart:

  • Expressions régulières
  • Interface graphique en option.Possède un "bouton Générer une ligne de commande" pour créer un texte de ligne de commande à placer dans un fichier batch.
  • Modèles multilignes :L'interface graphique vous permet de travailler facilement avec des modèles multilignes.Dans FART, vous devrez échapper manuellement aux sauts de ligne.
  • Vous permet de sélectionner l’encodage du fichier texte.Dispose également d'une option de détection automatique.

Téléchargez le 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"

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 utiliser le sed commande (ou téléchargement uniquement sed):

sed -c s/FOO/BAR/g filename

Je sais que je suis en retard à la fête.

Personnellement, j'aime la solution à:- 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 éléments fonctionnent de manière native, sans outils ni utilitaires supplémentaires nécessaires.

REMPLACEMENT :

DEL New.txt
setLocal EnableDelayedExpansion
For /f "tokens=* delims= " %%a in (OLD.txt) do (
Set str=%%a
set str=!str:FOO=BAR!
echo !str!>>New.txt
)
ENDLOCAL

DÉDUPLICATEUR (notez l'utilisation de -9 pour un numéro ABA) :

REM DE-DUPLICATE THE Mapping.txt FILE
REM THE DE-DUPLICATED FILE IS STORED AS new.txt

set MapFile=Mapping.txt
set ReplaceFile=New.txt

del %ReplaceFile%
::DelDupeText.bat
rem https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/sj8IUhMOq6o
setLocal EnableDelayedExpansion
for /f "tokens=1,2 delims=," %%a in (%MapFile%) do (
set str=%%a
rem Ref: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.RightString
set str=!str:~-9!
set str2=%%a
set str3=%%a,%%b

find /i ^"!str!^" %MapFile%
find /i ^"!str!^" %ReplaceFile%
if errorlevel 1 echo !str3!>>%ReplaceFile%
)
ENDLOCAL

Merci!

Quand tu travailles avec Git sous Windows alors allumez simplement git-bash et utilise sed.Ou, lorsque vous utilisez Windows 10, démarrez « Bash sur Ubuntu sous Windows » (à partir du sous-système Linux) et utilisez sed.

C'est un éditeur de flux, mais il peut éditer des fichiers directement en utilisant la commande suivante :

sed -i -e 's/foo/bar/g' filename
  • -i L'option est utilisée pour modifier sur place le nom de fichier.
  • -e L'option indique une commande à exécuter.
    • s est utilisé pour remplacer l'expression trouvée "foo" par "bar" et g 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 souhaiterez peut-être utiliser :

git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'

qui fait des merveilles.

J'ai utilisé Perl et cela fonctionne à merveille.

perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" <fileName>

.orig est l'extension qu'il ajouterait au fichier d'origine

Pour un certain nombre de fichiers correspondants tels que *.html

for %x in (<filePattern>) do perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" %x

J'ai joué avec certaines des réponses existantes ici et je préfère ma solution améliorée...

type test.txt | powershell -Command "$input | ForEach-Object { $_ -replace \"foo\", \"bar\" }"

ou si vous souhaitez enregistrer à nouveau la sortie dans un fichier...

type test.txt | powershell -Command "$input | ForEach-Object { $_ -replace \"foo\", \"bar\" }" > outputFile.txt

L’avantage de ceci est que vous pouvez diriger la sortie de n’importe quel programme.J'examinerai également la possibilité d'utiliser des expressions régulières avec cela.Cependant, je n'ai pas réussi à trouver comment en faire un fichier BAT pour une utilisation plus facile...:-(

Avec le remplacer.bat

1) Avec e? option qui évaluera les séquences de caractères spéciaux comme \n\r et les séquences Unicode.Dans ce cas, remplacera cité "Foo" et "Bar":

call replacer.bat "e?C:\content.txt" "\u0022Foo\u0022" "\u0022Bar\u0022"

2) Remplacement simple là où le Foo et Bar ne sont pas cités.

call replacer.bat "C:\content.txt" "Foo" "Bar"

Voici une solution qui a fonctionné sous Win XP.Dans mon fichier batch en cours d'exécution, j'ai inclus les éléments suivants :

set value=new_value

:: Setup initial configuration
:: I use && as the delimiter in the file because it should not exist, thereby giving me the whole line
::
echo --> Setting configuration and properties.
for /f "tokens=* delims=&&" %%a in (config\config.txt) do ( 
  call replace.bat "%%a" _KEY_ %value% config\temp.txt 
)
del config\config.txt
rename config\temp.txt config.txt

Le replace.bat le fichier est comme ci-dessous.Je n'ai pas trouvé de moyen d'inclure cette fonction dans le même fichier batch, car le %%a La variable semble toujours donner la dernière valeur de la boucle for.

replace.bat:

@echo off

:: This ensures the parameters are resolved prior to the internal variable
::
SetLocal EnableDelayedExpansion

:: Replaces Key Variables
::
:: Parameters:
:: %1  = Line to search for replacement
:: %2  = Key to replace
:: %3  = Value to replace key with
:: %4  = File in which to write the replacement
::

:: Read in line without the surrounding double quotes (use ~)
::
set line=%~1

:: Write line to specified file, replacing key (%2) with value (%3)
::
echo !line:%2=%3! >> %4

:: Restore delayed expansion
::
EndLocal

Jeter un coup d'œil à Existe-t-il un utilitaire de type sed pour cmd.exe qui demandait un équivalent sed sous Windows, devrait également s'appliquer à cette question.Résumé exécutif:

  • Cela peut être fait dans un fichier batch, mais ce n'est pas joli
  • De nombreux exécutables tiers disponibles qui le feront pour vous, si vous avez le luxe d'installer ou simplement de copier sur un exe
  • Peut être fait avec VBScript ou similaire si vous avez besoin de quelque chose capable de fonctionner sur une machine Windows sans modification, etc.

C'est peut-être un peu tard, mais je recherche fréquemment des produits similaires, car je ne veux pas avoir à subir la peine de faire approuver un logiciel.

Cependant, vous utilisez généralement l’instruction FOR sous diverses formes.Quelqu'un a créé un fichier de commandes utile qui effectue une recherche et un remplacement.Regarde ici.Il est important de comprendre les limites du fichier batch fourni.Pour cette raison, je ne copie pas le code source dans cette réponse.

Deux fichiers batch qui fournissent search and replace les fonctions ont été écrites par les membres de Stack Overflow dbenham et aacini en utilisant native built-in jscript sous Windows.

Ils sont tous les deux robust et very swift with large files par rapport aux scripts batch simples, et également simpler à utiliser pour le remplacement de base du texte.Ils ont tous les deux Windows regular expression correspondance de motifs.

  1. Cesed-like le fichier de commandes d'assistance est appelé repl.bat (par dbenham).

    Exemple utilisant le L commutateur littéral :

    echo This is FOO here|repl "FOO" "BAR" L
    echo and with a file:
    type "file.txt" |repl "FOO" "BAR" L >"newfile.txt"
    
  2. Ce grep-like le fichier de commandes d'assistance est appelé findrepl.bat (par aacini).

    Exemple avec des expressions régulières actives :

    echo This is FOO here|findrepl "FOO" "BAR" 
    echo and with a file:
    type "file.txt" |findrepl "FOO" "BAR" >"newfile.txt"
    

Les deux deviennent de puissants utilitaires à l’échelle du système when placed in a folder that is on the path, ou peut être utilisé dans le même dossier avec un fichier batch, ou à partir de l'invite cmd.

Ils ont tous les deux case-insensitive interrupteurs et aussi de nombreuses autres fonctions.

La commande Power Shell fonctionne à merveille

(
test.txt | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt
)

Je viens de faire face à un problème similaire - "Rechercher et remplacer du texte dans les fichiers", mais à l'exception du fait que pour les noms de fichiers et la recherche/remplacement, je dois utiliser regex.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 dispose d'une interface graphique).

Alors, en cherchant sur Google :) J'ai trouvé un excellent outil - FAR (Rechercher et remplacer) (pas de PET).

Ce petit programme a une belle interface graphique et prend en charge les expressions régulières 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 sous Win7).

C’est une chose que les scripts batch ne font tout simplement pas bien.

Le script plus de piment 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

@Rachel a donné une excellente réponse mais en voici une variante pour lire le contenu sur un PowerShell $data variable.Vous pouvez ensuite facilement manipuler le contenu plusieurs fois avant d'écrire dans un fichier de sortie.Voyez également comment les valeurs multilignes sont données dans les fichiers batch .bat.

@REM ASCII=7bit ascii(no bom), UTF8=with bom marker
set cmd=^
  $old = '\$Param1\$'; ^
  $new = 'Value1'; ^
  [string[]]$data = Get-Content 'datafile.txt'; ^
  $data = $data -replace $old, $new; ^
  out-file -InputObject $data -encoding UTF8 -filepath 'datafile.txt';
powershell -NoLogo -Noninteractive -InputFormat none -Command "%cmd%"

Utiliser PowerShell dans .bat - pour Windows 7+

l'encodage utf8 est facultatif, bon pour les sites Web

@echo off
set ffile='myfile.txt'
set fold='FOO'
set fnew='BAR'
powershell -Command "(gc %ffile%) -replace %fold%, %fnew% | Out-File %ffile% -encoding utf8"

je préfère utiliser sed depuis Utilitaires GNU pour Win32, les points suivants doivent être notés

  • simple citation '' ne fonctionnera pas sous Windows, utilisez "" plutôt
  • sed -i ne fonctionnera pas sous Windows, il faudra un fichier échange

Donc le code de travail de sed pour rechercher et remplacer du texte dans un fichier sous Windows, procédez comme ci-dessous

sed -e "s/foo/bar/g" test.txt > tmp.txt && mv tmp.txt test.txt

Télécharger Cygwin (gratuit) et utilisez des commandes de type Unix sur la ligne de commande Windows.

Votre meilleur pari :sed

Vous pouvez également consulter 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 fonctionner 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)

J'ai été confronté à ce problème plusieurs fois lors du codage sous Visual C++.Si vous l'avez, vous pouvez utiliser l'utilitaire de recherche et de remplacement de Visual Studio.Il vous permet de sélectionner un dossier et de remplacer le contenu de n'importe quel fichier de ce dossier par tout autre texte de votre choix.

Sous Visual Studio :EDIT -> Trouver et remplacer dans la boîte de dialogue ouverte, sélectionner votre dossier et remplir les cases "Find What" et "Remplacer par".J'espère que cela sera utile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top