我需要从一个字符串中替换字符*
,这是这样的:
*10.*31.**2.*65
我想使用批处理脚本从此字符串中删除所有*
。
答案 0 :(得分:22)
您可以将删除过程简化为一行。例如,如果我有这样的字符串:
set string=hello!
我想删除"!"在其中,我可以做到
set string=%string:!=%
该字符串现在将具有值"hello"
而不是"hello!"
修改:作为jeb pointed out in the comments,您无法使用此方法替换"*"
。这是因为*
是批处理文件模式匹配的通配符(对它的精彩解释here)。我在发布这个答案时并不知道这个,因为我假设这个替换方法适用于所有输入字符串。如果您特别需要替换*
,我建议您关注magoo's answer。否则,我将为那些需要通用,简短的单行解决方案来批量替换字符串的人保留这个答案。
答案 1 :(得分:5)
@ECHO OFF
SETLOCAL
SET mystring=*10.31.*2.*65
:deaster
FOR /f "tokens=1* delims=*" %%i IN ("%mystring%") DO (
SET mystring=%%j
IF DEFINED mystring (
SET mystring=%%i%%j
GOTO deaster
) ELSE (
SET mystring=%%i
)
)
ECHO result=%mystring%=
答案 2 :(得分:1)
您不需要整个脚本。您只需要一个for /f
循环。
C:\Users\rojo>set test=*10.*31.**2.*65
C:\Users\rojo>echo %test%
*10.*31.**2.*65
C:\Users\rojo>for /f "tokens=1-4 delims=.^*" %I in ("%test%") do @set test=%I.%J.%K.%L
C:\Users\rojo>echo %test%
10.31.2.65
如果您想将for
循环放入批处理脚本,请使用%%I
,%%J
,%%K
和%%L
而不是单个百分比。
答案 3 :(得分:1)
解决上述问题的另一种方法是在批处理脚本中使用PowerShell replace 命令。
set var=*10.*31.*2.*65
echo %var%>var.txt | powershell -command "(get-content var.txt) -replace '[^\x2A]+', '' | set-content var.txt"
set /p var=<var.txt
echo %var%
在上面的代码中,第二行
完成后,您将值读回到变量中。
要进一步说明 replace 命令,您要搜索的是第一个单引号。我们使用方括号将*字符标识为hex character(\ x2A是*的十六进制值)。在逗号之后,第二组单引号不包含任何值,因此将删除搜索到的对象。
另一种选择是使用尖号字符搜索除括号中的内容以外的所有内容。这将删除我们除了希望保留的所有内容。为此,您可以将第二行替换为:
echo %var%>var.txt | powershell -command "(get-content var.txt) -replace '[^\x30-x39\x2E]+', '' | set-content var.txt"
第一组字符\ x-30-x39标识0-9。\ x2E是句点。
完成文本文件后,输入一行以将其删除。
if exist var.txt del var.txt
答案 4 :(得分:1)
@echo off
setlocal EnableDelayedExpansion
set "str=*10.*31.**2.*65"
set "char=" & set "repl=" & set "loc=0"
echo !str!
call :replace
echo !repl!
exit /b
:replace
set "char=!str:~%loc%,1!
if "!char!" == "" exit /b
if "!char!" equ "*" set "char=_"
set "repl=!repl!!char!"
set /a "loc+=1"
goto :replace
endlocal
这是另一种解决方案。也许有点慢,但是通话设置太慢了。
答案 5 :(得分:0)
查看流编辑器sed。如果你在Windows上(假设你是),你可以在网上找到预编译的二进制文件。
echo "*10.31.*2.*65" | sed 's/\*//g'