Substituição de string em arquivo de lote

102

Podemos substituir strings em um arquivo em lote usando o seguinte comando

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

Essas linhas funcionam bem e mudam a string "pule sobre a cadeira" para "pule sobre a mesa". Agora quero substituir a palavra "cadeira" na string por alguma variável e não sei como fazer isso.

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

Alguma ideia?

Faisal
fonte
possível duplicata de como substituir string dentro de um arquivo bat com string de parâmetro de linha de comando que tem uma resposta muito mais informal (mas tem as mesmas soluções que as respostas aqui)
Fr0sT
1
agora não é importante quem foi o primeiro, mas é bom vincular perguntas idênticas e apontar para a resposta mais irrefutável
Fr0sT

Respostas:

79

Você pode usar!, Mas deve ter a chave ENABLEDELAYEDEXPANSION definida.

setlocal ENABLEDELAYEDEXPANSION
set word=table
set str="jump over the chair"
set str=%str:chair=!word!%
Vicky
fonte
4
Mas e se strele próprio for de expansão atrasada? set str=!str:chair=!word!!não funciona corretamente.
ImaginaryHuman072889
Eu entendo "jump over the !word!".
bers
88

Você pode usar o seguinte pequeno truque:

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

A callnão faz outra camada de expansão variável, tornando-se necessário citar os originais %sinais, mas tudo funciona no final.

Joey
fonte
Eu gosto dessa solução, escapar strings é sempre problemático em arquivos em lote, ENABLEDELAYEDEXPANSION apenas adiciona outro caractere para se preocupar.
Anders
9
Coisa importante em relação à resposta fornecida por Joey . Que você precisa colocar o código em um arquivo em lote para que funcione. Se você apenas testá-lo na linha de comando, ele retornará inesperado %"jump over the "word%%%. Esteja ciente de que o código em arquivos em lote e na linha de comando pode produzir resultados diferentes.
dadhi
2
Com base no comentário exato de dadhi, a solução para linha de comando está aqui: stackoverflow.com/questions/29944902/… .
Kenn Sebesta
2
Votei positivamente nesta resposta porque funciona nos dois sentidos, com a variável de ambiente em qualquer uma das posições ou nas posições "antes" e "depois": 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

Consegui usar a resposta de Joey para criar uma função:

Use-o como:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

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

GOTO:EOF

E essas funções na parte inferior do seu arquivo de lote.

: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

E lembre-se de que você DEVE adicionar "SETLOCAL ENABLEDELAYEDEXPANSION" no início do seu arquivo em lote ou então nada disso funcionará corretamente.

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

Isso funciona bem

@echo off    
set word=table    
set str=jump over the chair    
set rpl=%str:chair=%%word%    
echo %rpl%
Sérgio Maurício Trad
fonte
5
Desculpe, parece bom, MAS está errado! Ele remove a palavra chaire acrescenta a palavra table, mas não troca as duas palavras. Tente substituir a palavra overcom undere você começajump the chairunder
jeb