假设我们有一个变量,如;
set test=This is a Test string.
我们希望将每个小写t
替换为大写X
所需的输出;
This is a TesX sXring.
我尝试使用字符串操作set test=%test:t=X%
,但用t
替换每个X
。我也试过@dbenham的JREPL.bat但是不能解决它。
答案 0 :(得分:6)
没有本地批处理命令可以方便地执行区分大小写的字符串操作。本机批处理解决方案必须在循环中逐个字符地构建新字符串。非常可行 - 但是痛苦而且效率低下。
编辑 - 很久以前我编写了一个名为modFile.bat的纯批处理实用程序,它对文本文件的内容进行区分大小写的查找/替换。性能并不差,但确实有一些限制。我很少使用该代码。我编写了一个伴随例程来对变量而不是文本文件进行区分大小写的查找/替换,但我似乎丢失了该代码。
今天,每当我想操作文本时,我几乎总是使用JREPL.BAT。
您的示例的JREPL.BAT解决方案应为:
for /f delims^=^ eol^= %%A in ('jrepl t X /s test') do set "test=%%A"
但似乎有一个错误。如果变量名称是test
以外的某个名称,则它可以工作。看起来我有一些调试要做。
在修复错误之前,您可以使用:
for /f delims^=^ eol^= %%A in ('cmd /v:on /c "echo(!test!)|jrepl t X"') do set "test=%%A"
更新:错误已在版本3.4中修复 /S
选项现在适用于名为TEST
的变量。
答案 1 :(得分:2)
要保持纯批处理,可以通过字符区分大小写的比较来执行char:
@ECHO OFF
SETLOCAL EnableDelayedExpansion
SET String=This is a test.
SET "Result="
REM Process each char.
FOR /L %%A IN (0,1,999) DO (
SET Char=!String:~%%A,1!
REM Case sensitive char replacement.
IF "!Char!" EQU "t" SET Char=X
REM Append result.
SET Result=!Result!!Char!
)
REM Output will be: This is a XesX.
ECHO %Result%
ENDLOCAL
答案 2 :(得分:2)
如果您不需要完整的jrepl.bat功能,您可以制作自己的混合批处理脚本以使用JScript的String.prototype.replace()
功能。
@if (@CodeSection == @Batch) @Then
@echo off
setlocal
set test=This is a Test string.
:: invoke JScript and capture result to %test%
for /f "delims=" %%I in ('cscript /nologo /e:Jscript "%~f0" "%test%"') do (
set "test=%%I"
)
echo %test%
goto :EOF
:: end batch / begin JScript
@end
WSH.Echo(WSH.Arguments(0).replace(/t/g, 'X'));
输出:
This is a TesX sXring.
或者,如果您不介意使用PowerShell命令,-creplace
会进行区分大小写的替换。
@echo off
setlocal
set test=This is a Test string.
set psCommand=powershell -command "'%test%' -creplace 't','X'"
for /f "delims=" %%I in ('%psCommand%') do set "test=%%I"
echo %test%
相同的输出。
答案 3 :(得分:0)
我不认为下面的纯批处理解决方案效率低下(只需两行 no 循环即可实现替换)。它唯一的限制是它替换字符串中最多25个字母:
编辑:我修正了一个错误地替换了几个只用一个替换字母连接在一起的搜索字母的错误。
@echo off
setlocal EnableDelayedExpansion
set find=t
set repl=X
rem Prepare the replacement auxiliary variables (just once)
set "join=%%a"
for %%a in (b c d e f g h i j k l m n o p q r s t u v w x y z) do set "join=!join!%repl%%%%%a"
rem First method: fail when two search letters are joined together
set test=This is a Test string.
echo Input: %test%
echo Change "%find%" by "%repl%":
for /F "tokens=1-26 delims=%find%" %%a in ("%test%¡") do call set "out=%join%"
for /F "delims=¡" %%a in ("%out%") do set "out=%%a"
echo Output: %out%
echo/
rem Second method: previous bug fixed
set test=This Test String Have Two "t" Letters joined Together.
echo Input: %test%
echo Change "%find%" by "%repl%":
for /F "tokens=1-26 delims=%find%" %%a in ("!test:%find%%find%=%find%¿%find%!¡") do call set "out=%join%"
for /F "delims=¡" %%a in ("%out%") do set "out=%%a"
set "out=!out:%repl%¿%repl%=%repl%%repl%!"
echo Output: %out%
输出:
Input: This is a Test string.
Change "t" by "X":
Output: This is a TesX sXring.
Input: This Test String Have Two "t" Letters joined Together.
Change "t" by "X":
Output: This TesX SXring Have Two "X" LeXXers joined TogeXher.