我需要*
从一个字符串中替换字符,这有点像这样:
*10.*31.**2.*65
我想*
使用批处理脚本从此字符串中删除所有内容。
您可以将删除过程简化为一行。例如,如果我有这样的字符串:
set string=hello!
我想删除“!” 在里面,我可以做到
set string=%string:!=%
该字符串现在将具有该值"hello"
而不是"hello!"
编辑:正如jeb 在评论中指出的那样,您无法"*"
使用此方法进行替换。这是因为它是批处理文件模式匹配的通配符(此处*
对此进行了精彩的解释)。在发布此答案时我不知道这一点,因为我认为这种替换方法适用于所有输入字符串。如果您特别需要更换,我建议您遵循magoo 的回答。否则,我将为那些需要通用、简短、单行解决方案来批量替换字符串的人保留这个答案。*
@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%=
您不需要为此编写完整的脚本。你只需要一个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
不是单个百分比。
所述问题的另一个解决方案是在批处理脚本中使用 PowerShell替换命令。
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%
在上面的代码中,第二行
完成后,您将值读回变量中。
为了进一步解释替换命令,第一个单引号是您要搜索的内容。我们使用方括号将 * 字符标识为十六进制字符(\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
@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
这是另一种解决方案。也许有点慢,但调用集太慢了。
此代码将 a 替换为 b 字符:
Set search=%search:a=b%
查看sed,流编辑器。如果您使用的是 Windows(假设您是),则可以在 Web 上找到预编译的二进制文件。
echo "*10.31.*2.*65" | sed 's/\*//g'