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?


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!%

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.


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.

-4

Isso funciona bem

@echo off    
set word=table    
set str=jump over the chair    
set rpl=%str:chair=%%word%    
echo %rpl%

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.