Reemplazo de cadena en archivo por lotes

102

Podemos reemplazar cadenas en un archivo por lotes usando el siguiente comando

set str="jump over the chair"
set str=%str:chair=table%

Estas líneas funcionan bien y cambian la cadena "saltar sobre la silla" por "saltar sobre la mesa". Ahora quiero reemplazar la palabra "silla" en la cadena con alguna variable y no sé cómo hacerlo.

set word=table
set str="jump over the chair"
??

¿Algunas ideas?

Faisal
fuente
posible duplicado de cómo reemplazar la cadena dentro de un archivo bat con una cadena de parámetro de línea de comando que tiene una respuesta mucho más informal (aunque tiene las mismas soluciones que las respuestas aquí)
Viernes
1
ahora no importa quién fue el primero, pero es bueno vincular preguntas idénticas y señalar la respuesta más
irrefutable

Respuestas:

79

Puede usar!, Pero debe tener configurado el interruptor ENABLEDELAYEDEXPANSION.

setlocal ENABLEDELAYEDEXPANSION
set word=table
set str="jump over the chair"
set str=%str:chair=!word!%
Vicky
fuente
4
Pero, ¿y si en strsí mismo proviene de una expansión retrasada? set str=!str:chair=!word!!no funciona correctamente.
ImaginaryHuman072889
Yo entiendo "jump over the !word!".
bers
88

Puedes usar el siguiente pequeño truco:

set word=table
set str="jump over the chair"
call set str=%%str:chair=%word%%%
echo %str%

El callallí provoca otra capa de expansión variable, por lo que es necesario citar los %signos originales, pero todo funciona al final.

Joey
fuente
Me gusta esta solución, el escape de cadenas siempre es problemático en archivos por lotes, ENABLEDELAYEDEXPANSION solo agrega otro carácter del que preocuparse.
Anders
9
Cosa importante con respecto a la respuesta proporcionada por Joey . Que necesita poner el código en un archivo por lotes para que funcione. Si solo lo prueba en la línea de comando, devolverá inesperado %"jump over the "word%%%. Solo tenga en cuenta que el código en archivos por lotes y en la línea de comando puede producir resultados diferentes.
dadhi
2
Sobre la base del comentario puntual de dadhi, la solución para la línea de comandos está aquí: stackoverflow.com/questions/29944902/… .
Kenn Sebesta
2
Votar a favor esta respuesta porque funciona en ambos sentidos, con la variable de entorno en cualquier posición, o en las posiciones "antes" y "después": set word=table set str="jump over the chair" call set str=%%str:chair=%word%%% echo %str% set word1=chair set word2=desk set str="jump over the chair" call set str=%%str:%word1%=%word2%%% echo %str%'
Tom Warfield
0

Pude usar la respuesta de Joey para crear una función:

Úselo como:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

SET "MYTEXT=jump over the chair"
echo !MYTEXT!
call:ReplaceText "!MYTEXT!" chair table RESULT
echo !RESULT!

GOTO:EOF

Y estas funciones al final de su archivo por lotes.

:FUNCTIONS
@REM FUNCTIONS AREA
GOTO:EOF
EXIT /B

:ReplaceText
::Replace Text In String
::USE:
:: CALL:ReplaceText "!OrginalText!" OldWordToReplace NewWordToUse  Result
::Example
::SET "MYTEXT=jump over the chair"
::  echo !MYTEXT!
::  call:ReplaceText "!MYTEXT!" chair table RESULT
::  echo !RESULT!
::
:: Remember to use the "! on the input text, but NOT on the Output text.
:: The Following is Wrong: "!MYTEXT!" !chair! !table! !RESULT!
:: ^^Because it has a ! around the chair table and RESULT
:: Remember to add quotes "" around the MYTEXT Variable when calling.
:: If you don't add quotes, it won't treat it as a single string
::
set "OrginalText=%~1"
set "OldWord=%~2"
set "NewWord=%~3"
call set OrginalText=%%OrginalText:!OldWord!=!NewWord!%%
SET %4=!OrginalText!
GOTO:EOF

Y recuerde que DEBE agregar "SETLOCAL ENABLEDELAYEDEXPANSION" al principio de su archivo por lotes o nada de esto funcionará correctamente.

SETLOCAL ENABLEDELAYEDEXPANSION
@REM # Remember to add this to the top of your batch file.
Rachel Nichols
fuente
-4

Esto funciona bien

@echo off    
set word=table    
set str=jump over the chair    
set rpl=%str:chair=%%word%    
echo %rpl%
Sérgio Maurício Trad
fuente
5
Lo siento, se ve bien, ¡PERO está mal! Elimina la palabra chairy agrega la palabra table, pero no intercambia las dos palabras. Intente reemplazar la palabra overcon undery obtendrájump the chairunder
jeb