0

我是一个 Linux 人,正在尝试学习批处理脚本。

我有以下要求来操作字符串。

set string=1.23.10xxxx2

我想从上面的字符串中删除字母字符。

我需要输出为 1.23.102 或 1.23.10,这两个输出对我来说都很好,谁能帮帮我。

4

3 回答 3

3
@echo off
set remove=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

set string=1.23.10xxxx2
for /F "tokens=1,2 delims=%remove%" %%a in ("%string%") do (
   echo Part before removed chars: %%a
   echo Part after  removed chars: %%b
   echo Both parts: %%a%%b
)
于 2013-07-08T23:57:10.917 回答
2

如果格式具有一致的长度,那么您可以简单地使用子字符串操作。

要获得 1.23.10:

set "string=%string:~0,7%"

要获得 1.23.102:

set "string=%string:~0,7%%string:~-1%"

如果您只是删除字符x,则使用搜索和替换(始终不区分大小写):

set "string=%string:x=%"

以上所有内容都在帮助中进行了描述,由help set或访问set /?

但我怀疑以上都不能满足您的需求。批处理中没有内置任何内容来方便地搜索和替换字符范围。您可以使用 FOR 循环迭代地搜索和替换每个字母。这需要延迟扩展,因为正常扩展发生在解析时,并且整个 FOR 构造在一次传递中被解析。

setlocal enableDelayedExpansion
for %%C in (
  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
) do set "string=!string:%%C=!"

上述方法有效,但效率相对较低。

有许多第三方工具可以有效地解决问题。但是在某些环境中禁止使用非标准的可执行文件。我编写了一个名为REPL.BAT的混合批处理/JScript 实用程序,它非常适合解决这个问题。它适用于从 XP 开始的任何现代 Windows 机器。单击链接以获取脚本。完整的文档内置在脚本中。

假设 REPL.BAT 在您的当前目录中,或者更好的是,在您的 PATH 中的某个位置,那么以下将起作用:

for /f "eol=a delims=" %%S in ('repl "[a-zA-Z]" "" s string') do set "string=%%S"
于 2013-07-08T21:30:19.963 回答
1

您可以使用 GNUWin32 sed

@ECHO OFF &SETLOCAL
set "string=1.23.10xxxx2"
FOR /f %%a IN ('echo %string% ^| sed "s/[a-zA-Z]\+//"') DO set "newstring=%%a"
ECHO %newstring%
于 2013-07-08T21:03:34.913 回答