替换批处理脚本中的字符串字符

时间:2013-03-15 20:20:27

标签: batch-file

我需要从一个字符串中替换字符*,这是这样的:
*10.*31.**2.*65

我想使用批处理脚本从此字符串中删除所有*

6 个答案:

答案 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%

在上面的代码中,第二行

  • 将您的字符串写入文本文件
  • 调用PowerShell命令以获取该文件的内容
  • 将*字符替换为空
  • 用新值覆盖文本文件

完成后,您将值读回到变量中。

要进一步说明 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'