9

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

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

4

7 回答 7

35

您可以将删除过程简化为一行。例如,如果我有这样的字符串:

set string=hello!

我想删除“!” 在里面,我可以做到

set string=%string:!=%

该字符串现在将具有该值"hello"而不是"hello!"

编辑:正如jeb 在评论中指出的那样,您无法"*"使用此方法进行替换。这是因为它是批处理文件模式匹配的通配符(此处*对此进行了精彩的解释)。在发布此答案时我不知道这一点,因为我认为这种替换方法适用于所有输入字符串。如果您特别需要更换,我建议您遵循magoo 的回答。否则,我将为那些需要通用、简短、单行解决方案来批量替换字符串的人保留这个答案。*

于 2014-09-12T15:58:30.303 回答
6
@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%=
于 2013-03-15T20:38:44.243 回答
3

您不需要为此编写完整的脚本。你只需要一个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不是单个百分比。

于 2013-03-16T02:18:33.520 回答
2

所述问题的另一个解决方案是在批处理脚本中使用 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%

在上面的代码中,第二行

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

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

为了进一步解释替换命令,第一个单引号是您要搜索的内容。我们使用方括号将 * 字符标识为十六进制字符(\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
于 2018-08-10T16:43:19.133 回答
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

这是另一种解决方案。也许有点慢,但调用集太慢了。

于 2018-10-11T15:58:23.623 回答
-1

此代码将 a 替换为 b 字符:

Set search=%search:a=b%
于 2021-12-16T15:16:47.727 回答
-2

查看sed,流编辑器。如果您使用的是 Windows(假设您是),则可以在 Web 上找到预编译的二进制文件。

echo "*10.31.*2.*65" | sed 's/\*//g'
于 2013-03-15T20:40:22.997 回答