Comment trouver et remplacer du texte dans un fichier en utilisant L'environnement de ligne de commande Windows?

j'écris un script de fichier par lot en utilisant Windows command-line environment et je veux changer chaque occurrence d'un texte dans un fichier (ex. "FOO") avec un autre (ex. "BAR.)" Quelle est la façon la plus simple de le faire? Toutes les fonctions intégrées?

403
demandé sur Ray Vega 2008-09-13 01:48:26

26 réponses

si vous êtes sur la version Windows qui supporte .Net 2.0, je remplacerais votre shell. PowerShell vous donne la pleine puissance de .Net à partir de la ligne de commande. Il y a aussi de nombreux commandlets. L'exemple ci-dessous résoudra votre question. J'utilise les noms complets des commandes, il y a des alias plus courts, mais cela vous donne quelque chose pour Google.

(Get-Content test.txt) | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt
176
répondu Mike Schall 2014-03-10 13:07:42

beaucoup de réponses ici m'ont aidé à me diriger dans la bonne direction, mais aucune n'était appropriée pour moi, 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 occurrences 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 arg en ligne de commande pour powershell.exe contenant la commande d'exécution
  • (gc myFile.txt) lit le contenu de myFile.txt ( gc est l'abréviation de la commande Get-Content )
  • -replace 'foo', 'bar' exécute simplement la commande Remplacer foo par bar
  • | Out-File myFile.txt pipes la sortie vers le fichier myFile.txt

Powershell.exe devrait faites déjà partie de votre déclaration PATH, mais si ce n'est pas le cas, vous pouvez l'ajouter. L'emplacement de celui-ci sur ma machine est C:\WINDOWS\system32\WindowsPowerShell\v1.0

189
répondu Rachel 2014-01-08 15:01:35

peu utilisé PÉTER (" F ind Un nd R remplacer T ext" utilitaire de ligne de commande):

excellent petit freeware pour le remplacement de texte dans un grand ensemble de fichiers.

les fichiers de configuration 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 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é ou élégant;)


mise à Jour de 2017 (7 ans plus tard) jagb souligne dans les commentaires à l'article de 2011 " Péter Facilement Trouver Et Remplacer du Texte " à partir de Mikail Tunç

149
répondu VonC 2017-05-23 11:47:21

remplacer - remplacer un substrat par substitution de chaîne Description: pour remplacer un substrat par une autre chaîne, utilisez la fonction de substitution de chaîne. L'exemple présenté ici remplace toutes les occurrences" teh "par" the " dans la variable string.

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

ref: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace

114
répondu Bill Richardson 2011-07-26 13:09:32

Créer 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 une commande semblable à ce à partir de l'invite de commande:

cscript replace.vbs "C:\Scripts\Text.txt" "Jim " "James "

51
répondu user459118 2012-04-12 03:48:43

BatchSubstitute.bat on dostips.com est un exemple de recherche et de remplacement utilisant un fichier pur par lots.

il utilise une combinaison de FOR , FIND et CALL SET .

Les lignes

contenant les caractères "&<>]|^ peuvent être traitées incorrectement.


48
répondu morechilli 2012-04-11 08:33:08

Note - assurez-vous de voir la mise à jour à la fin de cette réponse pour un lien vers le jrpl supérieur.BAT qui remplace REPL.CHAUVE-SOURIS

JREPL.BAT 7.0 et au-dessus de supporte nativement unicode (UTF-16LE) via l'option /UTF , ainsi que tout autre jeu de caractères, y compris UTF-8, via ADO!!!!


j'ai écrit un petit utilitaire JScript/batch hybride appelé REPL.BAT qui est très pratique pour modifier les fichiers ASCII (ou étendus ASCII) via la ligne de commande ou un fichier batch. Le script purely native ne nécessite pas l'installation d'un tiers exécutable, et il fonctionne sur N'importe quelle version Windows moderne à partir de XP. Il est également très rapide, surtout par rapport à des solutions pures en fournée.

REPL.Chauve-souris s'écrit simplement stdin, effectue une recherche JScript regex et remplace, et écrit le résultat à stdout.

voici un exemple trivial de la façon de remplacer foo par bar in test.txt, en supposant REPL.BAT est dans votre dossier courant, ou mieux encore, quelque part dans votre chemin:

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

les capacités de JScript regex le rendent très puissant, en particulier la capacité du texte de remplacement de faire référence à des substrats capturés à 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 et X permet la modification des fichiers binaires! L'option M permet des recherches sur plusieurs lignes. L'option X eXtended substitution pattern fournit des séquences d'échappement qui permettent l'inclusion de n'importe quelle 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 la réponse.Chauve-souris de script. La documentation complète est intégrée dans le 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,  represents the first captured
:::            submatch,  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
:::                 through . 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)" "" 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("151910920",,){
          return String.fromCharCode(parseInt("0x"+"151910920".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("151910920",,){
          return String.fromCharCode(parseInt("0x"+"151910920".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,"\");
    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("151910920", , , , , , , , , , ) {
  var $=arguments;
  return(eval(replace));
}



MISE À JOUR IMPORTANTE

j'ai cessé le développement de REPL.BAT, et remplacé par JRPL.CHAUVE. Cette nouvelle utilité a tout de même fonctionnalité de REPL.BAT, plus beaucoup plus:

  • Unicode UTF-16LE support via les capacités unicode natives de CSCRIPT, et tout autre jeu de caractères (y compris UTF-8) via ADO.
  • lire directement depuis / écrire directement dans un fichier: Pas besoin de pipes, de redirection ou de commande move.
  • incorporent JScript fourni par l'utilisateur
  • facilité de traduction similaire à unix tr, seulement il prend en charge la recherche regex et JScript remplacer
  • jeter le texte qui ne correspond pas
  • lignes de sortie préfixées par le numéro de ligne
  • et plus...

comme toujours, une documentation complète est intégrée dans le script.

la solution triviale originale est maintenant encore plus simple:

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

La version actuelle de JREPL.BAT est disponible au DosTips . Lire tous les des messages suivants dans le fil pour voir des exemples d'utilisation et une histoire du développement.

41
répondu dbenham 2017-09-09 16:50:07

Use FNR

utilisez l'utilitaire fnr . Il a quelques avantages sur fart :

  • expressions régulières
  • GUI facultatif. Dispose d'un" bouton de ligne de commande Générer " pour créer le texte de ligne de commande à mettre dans le fichier de lot.
  • modèles multi-lignes: L'interface graphique vous permet de travailler facilement avec des modèles multi-lignes. En PET, vous devez vous échapper manuellement.
  • Vous permet de sélectionner l'encodage de fichier texte. Dispose également d'une option de détection automatique.

télécharger FNR ici: http://findandreplace.codeplex.com /

exemple D'utilisation: fnr --cl --dir "<Directory Path>" --fileMask "hibernate.*" --useRegEx --find "find_str_expression" --replace "replace_string"

29
répondu Aman 2016-06-08 11:48:20

Je ne pense pas qu'il y ait 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 commande sed (ou télécharger seulement sed ):

sed -c s/FOO/BAR/g filename
24
répondu Ferruccio 2012-07-25 16:24:18

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 aussi largement la fonction Dedupe pour nous aider à livrer environ 500 e-mails par jour via SMTP à partir de: - https://groups.google.com/forum/#!topic / alt.msdos.lot.nt/sj8IUhMOq6o

et ces deux native sans outils ou utilitaires supplémentaires nécessaires.

remplacer:

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

DEDUPLICATOR (noter 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!

17
répondu Leptonator 2015-08-05 13:57:06

quand vous travaillez avec Git on Windows puis tout simplement allumer git-bash et utiliser sed . Ou, en utilisant Windows 10, démarrer "Bash on Ubuntu on Windows" (à partir du sous-système Linux) et utiliser sed .

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

sed -i -e 's/foo/bar/g' filename
L'option
  • -i est utilisée pour modifier en place le nom du fichier.
  • -e option indique une commande à exécuter.
    • s est utilisé pour remplacer l'expression "foo" par "bar" et g est utilisé pour remplacer les correspondances trouvées.

Note de ereOn:

si vous voulez remplacer une chaîne dans les fichiers versionnés seulement d'un dépôt Git, vous pouvez utiliser:

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

qui fait des merveilles.

13
répondu Jens A. Koch 2016-10-07 22:31:27

j'ai utilisé perl, et cela fonctionne merveilleusement.

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

.orig est l'extension qu'il ajouterait au fichier original

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

for %x in (<filePattern>) do perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" %x
12
répondu Faisal 2011-09-18 22:40:43

j'ai joué avec quelques-unes 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 voulez sauvegarder la sortie à nouveau dans un fichier...

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

l'avantage de ceci est que vous pouvez pipe en sortie de n'importe quel programme. Va regarder dans l'utilisation des expressions régulières avec cela aussi. Impossible de trouver comment le rendre dans un fichier BAT pour une utilisation plus facile... :- (

12
répondu Simon East 2012-05-08 00:00:04

avec le remplaçant .chauve-souris

1) avec l'option e? qui évaluera les séquences de caractères spéciaux comme \n\r et les séquences unicode. Dans ce cas, remplacer "Foo" et "Bar" Cités:

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

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

call replacer.bat "C:\content.txt" "Foo" "Bar"
11
répondu npocmaka 2015-10-15 13:05:21

Voici une solution qui a fonctionné sur Win XP. Dans mon fichier batch en cours d'exécution, j'ai inclus ce qui suit:

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 fichier replace.bat est comme ci-dessous. Je n'ai pas trouvé de moyen d'inclure cette fonction dans le même fichier batch, parce que la variable %%a semble toujours donner la dernière valeur dans 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
10
répondu Chad 2012-04-11 08:36:09

jetez un coup d'oeil à Existe-t-il une utilité similaire à celle de cmd.exe qui demandait un équivalent sed sous Windows, devrait s'appliquer à cette question aussi. Résumé:

  • cela peut être fait dans le fichier batch, mais ce n'est pas joli
  • beaucoup d'exécutables tiers disponibles qui le feront pour vous, si vous avez le luxe d'installer ou tout simplement copier sur un exe
  • peut être fait avec VBScript ou similaire si vous avez besoin de quelque chose capable de fonctionner sur une fenêtre Windows sans modification, etc.
7
répondu Jay 2017-05-23 11:47:21

peut être un peu en retard, mais je suis souvent à la recherche de choses similaires, car je ne veux pas passer à travers la douleur d'obtenir le logiciel approuvé.

cependant, vous utilisez généralement la déclaration pour diverses formes. Quelqu'un a créé un fichier batch utile qui fait une recherche et remplacer. Avoir un regard ici . Il est important de comprendre les limites du fichier de commandes fournies. Pour cette raison, Je ne copie pas le code source dans cette réponse.

4
répondu Peter Schuetze 2009-12-23 16:20:39

deux fichiers par lot qui fournissent des fonctions search and replace ont été écrits par les membres dbenham et aacini utilisant native built-in jscript sous Windows.

ils sont à la fois robust et very swift with large files par rapport aux scripts en lot simple, et aussi simpler à utiliser pour le remplacement de base du texte. Ils ont tous les deux des motifs Windows regular expression .

======================================================================================

1) ce fichier par lot sed-like est appelé repl.bat (par dbenham) - télécharger à partir de: https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

exemple utilisant le commutateur littéral L :

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 fichier par lot grep-like est appelé findrepl.bat (par aacini) - télécharger à partir de: https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

exemple dont les expressions régulières sont actives:

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

======================================================================================

deviennent tous les deux des utilitaires système puissants when placed in a folder that is on the path , ou peuvent être utilisés dans le même dossier avec un fichier batch, ou à partir de l'invite cmd.

ils ont tous les deux des commutateurs case-insensitive et aussi beaucoup d'autres fonctions.

4
répondu foxidrive 2014-07-22 13:18:51

Power shell de commande fonctionne comme un charme

(
test.txt | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt
)
3
répondu kool_guy_here 2012-05-08 10:58:07

vient de faire face à un problème similaire - "rechercher et remplacer le texte dans les fichiers", mais avec l'exception que pour les noms de fichiers et la recherche/repalce je dois utiliser regex. Parce que je ne suis pas familier avec Powershell et que je veux sauvegarder mes recherches pour une utilisation ultérieure, j'ai besoin de quelque chose de plus "convivial" (préférable si elle a GUI).

donc, en Googlant :) j'ai trouvé un grand outil - loin (trouver et remplacer) (pas de PET).

ce petit le programme a la bonne GUI et le soutien regex pour la recherche dans les noms de fichiers et dans les fichiers. Seulement disadventage est que si vous voulez enregistrer vos paramètres, vous devez exécuter le programme en tant qu'administrateur (au moins sur Win7).

3
répondu madcorp 2015-08-04 15:25:33

C'est une chose que les scripts par lots ne font pas bien.

le script morechilli lié à va fonctionner pour certains fichiers, mais malheureusement il va s'étouffer sur ceux qui contiennent des caractères tels que les pipes et ampersands.

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

2
répondu 2008-09-17 17:58:08

@Rachel a donné une excellente réponse, mais voici une variation de celui-ci pour lire le contenu d'une powershell $data variable. Vous pouvez alors facilement manipuler le contenu plusieurs fois avant d'écrire dans un fichier de sortie. Voir aussi comment les valeurs multilignes sont données dans A.chauve-souris des fichiers batch.

@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%"
2
répondu Whome 2017-06-15 21:21:51

utilisez powershell in .bat - Pour Windows 7 +

encoding 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"
1
répondu Wagner Pereira 2018-04-17 01:12:44

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

votre meilleure mise: sed

0
répondu jm. 2010-01-25 17:49:36

peut aussi voir les outils de remplacement et de remplacement à https://zoomicon.github.io/tranXform / (source incluse). Le 2e est un filtre.

l'outil qui remplace les chaînes de caractères dans les fichiers se trouve dans VBScript (Windows Script Host [WSH] doit être utilisé dans les anciennes versions de Windows)

le filtre ne fonctionne probablement pas avec Unicode sauf si vous recompilez avec le dernier Delphi (ou avec FreePascal / Lazarus)

0
répondu George Birbilis 2018-04-05 14:46:08

j'ai affronté ce problème plusieurs fois en codant sous C++visuel. Si vous l'avez, vous pouvez utiliser Visual studio Find et remplacer L'utilitaire. Il vous permet de sélectionner un dossier et remplacer le contenu d'un fichier dans ce dossier avec tout autre texte que vous voulez.

Sous Studio Visuel: Modifier - > trouver et remplacer Dans la boîte de dialogue ouverte, sélectionnez votre dossier et remplissez les cases "trouver quoi" et "remplacer par". Espérons que ce sera utile.

-5
répondu Nadjib 2015-03-25 15:55:06