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

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

[复制链接]
发表于 2024-6-24 20:39:08 | 显示全部楼层
回复 10# 77七


    $1^=$1是$1=$1^$1,$1是空值,在数值计算中被视为0,$1的0次方为1。

$1=$1是赋值语句,赋值语句的真假通过赋值后的值判断,$1为空即假, 不执行输出。

评分

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

查看全部评分

发表于 2024-6-24 20:39:57 | 显示全部楼层
回复 15# ShowCode


   感谢大佬分享!测试代码结果正确。
发表于 2024-6-24 21:36:43 | 显示全部楼层
回复 16# buyiyang


   感谢大佬分享!我现在明白了为什么多了个数字1了。我自己尝试了一会,对$0,$1-n有了初步的了解,如 如果$2不为空,$1=$2,会多出第二列。
发表于 2024-6-25 12:23:22 | 显示全部楼层

用11楼的4种方法作了用时测试(分别获取同一组约50个文件名的数值字段总和最终定向到各自的结果文件),分享一下结果数据如下...
   sed方法》用时0.37s(1.0)
   call方法》用时0.76s(2.1)
   jscript方法》用时0.95s(2.6)
   powershell方法》用时6.92s(18.7)
除了纯P的call方法之外,其余三种外部调用方法均经历两层循环体,虽然powershell功能丰富且代码轻量化,但用时最长

评分

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

查看全部评分

发表于 2024-6-25 20:14:57 | 显示全部楼层
本帖最后由 WHY 于 2024-7-2 00:25 编辑
  1. dir /b /a-d *.txt | sed -r "/[0-9]/!d; s/[^0-9]+//g"
复制代码
  1. dir /b /a-d *.txt | gawk "/[0-9]/{gsub(/[^0-9]+/, "");print}"
复制代码
  1. PowerShell "(dir *[0-9]*.txt -File).BaseName -replace '\D+'"
复制代码
  1. @if(0)==(0) echo off
  2. dir /b /a-d *.txt | cscript //nologo //e:jscript "%~f0"
  3. pause & exit
  4. @end

  5. while (!WSH.StdIn.AtEndOfStream) {
  6.     var s = WSH.StdIn.Readline().replace(/\D+/g, '');
  7.     if (/./.test(s)) WSH.Echo(s);
  8. }
复制代码
假设文件名不超过256个字符。事实上,在默认情况下,Windows系统中的路径长度被限制在256个字符以内。
0x!s:~15,1!  应该是16
  1. @echo off
  2. for /L %%i in (0 1 9) do set _%%i=1
  3. for /f "delims=" %%i in ('dir /b /a-d *.txt ^| findstr "[0-9]"') do (
  4.     set "name=%%~ni"
  5.     setlocal enabledelayedexpansion
  6.     set "s=!name!"
  7.     for %%j in (128 64 32 16) do (
  8.         if "!s:~%%j!" NEQ "" (
  9.             set /a Len+=%%j
  10.             set "s=!s:~%%j!"
  11.         )
  12.     )
  13.     set "s=!s!FEDCBA9876543210"
  14.     set /a Len+=0x!s:~16,1!
  15.     for /L %%j in (0 1 !Len!) do (
  16.         set "s1=!name:~%%j,1!"
  17.         if defined _!s1! (
  18.             set "newName=!newName!!s1!"
  19.         )
  20.     )
  21.     echo;!newName!
  22.     endlocal
  23. )
  24. pause
复制代码

评分

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

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 01:39 , Processed in 0.021206 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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