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

问题描述 投票:0回答:7

我需要从字符串中替换字符

*
,如下所示:
*10.*31.**2.*65

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

*

batch-file
7个回答
53
投票

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

set string=hello!

我想删除“!”在其中,我可以做

set string=%string:!=%

该字符串现在的值为

"hello"
而不是
"hello!"

编辑:正如jeb在评论中指出的那样,您无法使用此方法替换

"*"
。这是因为
*
是批处理文件模式匹配的通配符(对其的精彩解释here)。在发布此答案时我并不知道这一点,因为我假设此替换方法适用于所有输入字符串。如果您特别需要更换
*
,我建议您遵循magoo的答案。否则,我将为那些需要通用、简短、单行解决方案来批量字符串替换的人保留这个答案。


10
投票
@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%=

5
投票

为此您不需要完整的脚本。 您只需要一个

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
而不是单个百分比。


4
投票

上述问题的另一个解决方案是在批处理脚本中使用 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 命令来获取该文件的内容
  • 将 * 字符替换为 null
  • 用新值覆盖文本文件

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

为了进一步解释 replace 命令,第一个单引号是您要搜索的内容。 我们使用方括号将 * 字符标识为十六进制字符(\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



1
投票
这是另一种解决方案。也许有点慢,但是调用设置太慢了。


1
投票

Set search=%search:a=b%



0
投票
sed

。如果您使用的是 Windows,您可以在网络上找到预编译的二进制文件。 echo "*10.31.*2.*65" | sed 's/\*//g'

	
© www.soinside.com 2019 - 2024. All rights reserved.