找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 67232|回复: 19

[文本处理] [分享]批处理只保留字符串里面的数字

[复制链接]
发表于 2023-1-7 21:39:16 | 显示全部楼层 |阅读模式
【问题描述】

怎么提取字符串里面的数字,删除其它字符,
比如:123Bat456Home789论坛
结果:123456789
 楼主| 发表于 2023-1-7 21:39:34 | 显示全部楼层
【解决方案】

test_1.bat
这个代码有问题,请参考6楼的方法。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "StrOld=123Bat456Home789论坛"
  4. set "StrTmp=%StrOld%"
  5. for /l %%i in (0 1 9) do (
  6.     set "StrTmp=!StrTmp:%%i= !"
  7. )
  8. set "StrNew=%StrOld%"
  9. for %%i in (!StrTmp!) do (
  10.     set StrNew=!StrNew:%%i=!
  11. )
  12. echo,!StrNew!
  13. pause
复制代码
 楼主| 发表于 2023-1-7 21:45:26 | 显示全部楼层
test_2.bat
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "str=123Bat456Home789论坛"
  4. set "num="
  5. :Loop
  6. set "char=%str:~0,1%"
  7. if %char% geq 0 (
  8.     if %char% leq 9 (
  9.         set "num=!num!%char%"
  10.     )
  11. )
  12. set str=%str:~1%
  13. if "%str%" neq "" (
  14.     goto :Loop
  15. )
  16. echo,%num%
  17. pause
复制代码
 楼主| 发表于 2023-1-7 21:53:32 | 显示全部楼层
test_3.bat
  1. @echo off
  2. set "StrOld=123Bat456Home789论坛"
  3. for /f "delims=" %%i in ('powershell "'%StrOld%' -replace '[^\d]*',''"') do (
  4.     set "StrNew=%%i"
  5. )
  6. echo,%StrNew%
  7. pause
复制代码
发表于 2023-1-8 08:57:41 | 显示全部楼层
来个第3方工具gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )的实现方法

  1. echo;123Bat456Home789 论坛|gawk -vOFS="" -F"[^0-9]+" "$1=$1"
复制代码
发表于 2023-1-8 09:14:21 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2023-1-8 10:29 编辑

回复 2# Batcher
2楼代码有bug。如果对于数字分隔的非数字字段来说,存在前面字段包含于后面的字段,就会出现问题,比如:
  1. set "StrOld=123Bat456BatHome789论坛"
复制代码
前面的Bat字段包含于后面的BatHome字段,处理后的结果为:
  1. 123456Home789
复制代码
这样应当可以:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "StrOld=123Bat456BatHome789论坛"
  4. for /l %%i in (0 1 9) do (
  5.     set "StrOld=!StrOld:%%i= %%i !"
  6. )
  7. for %%i in (!StrOld!) do (
  8.     if %%i geq 0 (
  9.         if %%i leq 9 (
  10.             set StrNew=!StrNew!%%i
  11.         )
  12.     )
  13. )
  14. echo,!StrNew!
  15. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
Batcher + 1 感谢分享

查看全部评分

 楼主| 发表于 2023-1-8 11:49:48 | 显示全部楼层
回复 5# hfxiang


再来个sed
  1. echo 123Bat456Home789论坛 | sed "s/[^0-9]//g"
复制代码
发表于 2024-6-24 10:23:13 | 显示全部楼层
回复 5# hfxiang


   大佬,请教下,我把命令写到for里面,为什么结果之前多了一个数字 1 呢?
  1. @echo off
  2. cd.>a1.txt
  3. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  4.         for /f "delims=" %%j in ('echo;%%~ni^|gawk -vOFS^="" -F"[^0-9]+" "$1^=$1"') do (
  5.                 echo [%%j]
  6.         )
  7. )
  8. pause
复制代码
发表于 2024-6-24 11:21:56 | 显示全部楼层
回复 8# 77七
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  3.         for /f "delims=" %%j in ('echo %%~ni ^| gawk -v OFS^="" -F "[^0-9]+" "$1=$1"') do (
  4.                 echo [%%j]
  5.         )
  6. )
复制代码
C:\Test>dir /b *.txt
123Bat456Home789.txt

C:\Test>1.bat
[123456789]

C:\Test>gawk --version
GNU Awk 5.1.0, API: 3.0
发表于 2024-6-24 11:32:41 | 显示全部楼层
本帖最后由 77七 于 2024-6-24 11:40 编辑

回复 9# ShowCode


   感谢大佬帮助!我测试了以字母开头的文件名,结果为空,比如 a1.txt。用5楼代码 测试 字母开头的字符串,结果同样为空。
发表于 2024-6-24 17:24:11 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-6-24 17:36 编辑


借8楼旧帖新续,也给几个版本仅供参考,示例题型》提取并链接当前目录中全部文本文件名包含的数值字段
一。采用纯P递归方法
二。调用jscript正则替换方法
三。调用sed.exe正则替换方法
四。调用powershell正则替换方法

  1. @set @x=1 /* &@echo off &setlocal
  2. for %%F in (*.txt) do (
  3.         set "_F=" &(call :get#n "%%~nF")
  4.         for /f %%a in (' cscript /nologo /e:jscript "%~f0" "%%~nF" ') do echo,%%a
  5.         for /f %%a in (' echo,"%%~nF"^|sed "s/[^0-9]//g" ') do echo,%%a
  6.         for /f %%a in (' powershell " '%%~nF' -replace '[^\d]' " ') do echo,%%a
  7. )
  8. endlocal&pause&exit/b
  9. :get#n
  10.         if "%~1"=="" echo,%_F%&exit/b
  11.         set s=%~1
  12.         set c=%s:~,1%
  13.         if "%c%" geq "0" if "%c%" leq "9" set _F=%_F%%c%
  14.         call :get#n "%s:~1%"
  15.         exit/b
  16. */
  17. v=WSH.arguments, WSH.echo(v(0).replace(/[^\d]/g,'')), WSH.quit();
复制代码

评分

参与人数 1技术 +1 收起 理由
77七 + 1 感谢分享

查看全部评分

发表于 2024-6-24 18:17:18 | 显示全部楼层
本帖最后由 WHY 于 2024-6-24 23:31 编辑

回复 10# 77七


    echo;a1|gawk -vOFS="" -F"[^0-9]+" "$1=$1"
这个时候 $1 值为空,可能 gawk 认为 "$1=$1" 赋值后条件不成立,所以没有输出。
  1. for /f %%i in ('echo;a123Bat456Home789 论坛^|gawk "{gsub(/[^0-9]+/, "")}1"') do echo [%%i]
复制代码
或者
  1. for /f %%i in ('echo;a123Bat456Home789 论坛^|gawk -vOFS^="" -F"[^0-9]+" "NF=NF"') do echo [%%i]
复制代码
试试。

评分

参与人数 1技术 +1 收起 理由
77七 + 1 感谢分享

查看全部评分

发表于 2024-6-24 20:18:14 | 显示全部楼层
回复 11# aloha20200628


   感谢大佬分享!正则替换很强大。
发表于 2024-6-24 20:27:35 | 显示全部楼层
回复 12# WHY


   感谢大佬分享!之前没有结果,我还以为是转义出现了问题,把引号内的等号也转义了,结果却多了个数字1。5楼的gawk代码我看不懂,尤其是$1,经过您指点,我大概理解是 批处理中的 第一列的意思,我尝试添加了第二列,结果居然是对的。
  1. echo;a1b2c3|gawk -vOFS="" -F"[^0-9]+" "$1=$1;$2=$2"
复制代码
发表于 2024-6-24 20:32:33 | 显示全部楼层
回复 10# 77七
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  3.     for /f "delims=" %%j in ('echo %%~ni ^| gawk -v OFS^="" -F "[^0-9]+" "NF+=0"') do (
  4.         echo [%%j]
  5.     )
  6. )
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 00:17 , Processed in 0.024468 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表