Board logo

标题: [文本处理] 批处理 删除文本中全部英文符号 [打印本页]

作者: o小奏o    时间: 2022-10-14 19:32     标题: 批处理 删除文本中全部英文符号

本帖最后由 o小奏o 于 2022-10-18 11:56 编辑

水个帖子

删除感叹号(只能用%%),注意要在for外面,for内部要操作变量要用到!
  1. echo off&SETLOCAL ENABLEDELAYEDEXPANSION
  2. set /p a=<awa.txt
  3. set a=%a:!=%
复制代码
删除星号(单独用%% , 多次用!!),如果有多个星号就多叠几个吧。
  1. set a=!a:**=!
  2. set a=!a:**=!
  3. ......
复制代码
删除百分号(只能用!!),同多个星号,一般多叠几个就够用了。
  1. set a=!a:%%=!
  2. set a=!a:%%=!
  3. ......
复制代码
目前的平替方案就这样,其他好的再慢慢发掘
(以上只是作为入门级别的我的实践成果)
作者: fzp070    时间: 2022-10-14 20:24

本帖最后由 fzp070 于 2022-10-14 20:52 编辑

如下方法也可以试试,不过还有缺陷,如字符中有3个及以上!号时会丢失字符。

awa.txt内容为:
  1. 123@%*!456?=7!89
复制代码
代码为:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p pp=<awa.txt
  4. echo;"!pp!"
  5. ::本次去除!号
  6. :Loop1
  7. for /f "tokens=1* delims=!" %%a in ("!pp!") do set "pp=%%a%%b"
  8. echo,"!pp!"|findstr "[!]">nul&&goto :Loop1
  9. echo,"!pp!"
  10. ::本次去除*号
  11. :Loop2
  12. for /f "tokens=1* delims=*" %%a in ("!pp!") do set "pp=%%a%%b"
  13. echo,"!pp!"|findstr "[*]">nul&&goto :Loop2
  14. echo,"!pp!"
  15. ::本次去除%号
  16. :Loop3
  17. for /f "tokens=1* delims=%%" %%a in ("!pp!") do set "pp=%%a%%b"
  18. echo,"!pp!"|findstr "[%]">nul&&goto :Loop3
  19. echo,"!pp!"
  20. ::本次去除?号
  21. :Loop4
  22. for /f "tokens=1* delims=?" %%a in ("!pp!") do set "pp=%%a%%b"
  23. echo,"!pp!"|findstr "[?]">nul&&goto :Loop4
  24. echo,"!pp!"
  25. ::本次去除=号
  26. :Loop5
  27. for /f "tokens=1* delims==" %%a in ("!pp!") do set "pp=%%a%%b"
  28. echo,"!pp!"|findstr "[=]">nul&&goto :Loop5
  29. echo,"!pp!"
  30. ::本次去除@号
  31. :Loop6
  32. for /f "tokens=1* delims=@" %%a in ("!pp!") do set "pp=%%a%%b"
  33. echo,"!pp!"|findstr "[@]">nul&&goto :Loop6
  34. echo,"!pp!"
  35. pause
复制代码
结果为:
  1. "123@%*!456?=7!89"
  2. "123@%*456?=789"
  3. "123@%456?=789"
  4. "123@456?=789"
  5. "123@456=789"
  6. "123@456789"
  7. "123456789"
  8. 请按任意键继续. . .
复制代码

作者: pd1    时间: 2022-10-15 10:49

powershell简单些,不用考虑那么多
  1. <# :
  2. @echo off
  3. powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0' |Out-String|Invoke-Expression"
  4. pause
  5. #>
  6. $a="123@%*!456?=7!89"
  7. $regex = [regex]"[^@%*?+!=]*"
  8. $s=""
  9. $result = $regex.Matches($a)
  10. $result |%{$s+=$_.Value}
  11. write-host $s
复制代码

作者: o小奏o    时间: 2022-10-16 22:17

本帖最后由 o小奏o 于 2022-10-18 11:54 编辑

回复 2# fzp070
我觉得你的思路确实很好,把字符串切开再拼起来,不过这种方式唯一就怕很多感叹号,应该是echo,"!pp!"在系统解析时字符串里!xxx!被解析成无定义的变量,所以直接没了。可以用延迟变量解决
经过我的研究,我有一套比较成熟的方案:
首先用for中delims把!*=~干掉(这四个符号直接用延迟变量set掉会出现意想不到的错误)
然后用findstr直接读文件判断是否还有符号(echo.!str!|findstr也用到延迟变量,不可用)
最后考虑到有大量跳转delims效率感人和findstr难以匹配"双引号,所以其他符号用set比较好
因此决定用for中delims和set组合的办法:
  1. delims !*=~ 和 findstr /n ^! ^* ^= ^~
  2. set 【%%】【^`】【^^】【^(】【^)】【^|】【^<】【^>】【@】【#】【$】【+】【{】【}】【:】【"】【?】【-】【[】【]】【;】【'】【\】【,】【.】【/】
复制代码
测试出来的小知识:关变量延迟->for中set->开变量延迟  可以让set突破1024字节的上限,达到8192字节
————————————————————————————————————————————————————————————————————————————
测试过的代码如下(处理单行的情况)
————————————————————————————————————————————————————————————————————————————
  1. @ECHO OFF&SETLOCAL ENABLEDELAYEDEXPANSION
  2. chcp 65001>NUL
  3. :Loop1
  4. ENDLOCAL
  5. for /f "tokens=1* delims=!*=~"  %%i in (TextTemp) do (set "i=%%i%%j"
  6.     SETLOCAL ENABLEDELAYEDEXPANSION
  7.     echo.!i!>TextTemp
  8.     for /f "delims=" %%o in ('findstr /n "^! ^* ^= ^~" TextTemp') do set Arr=%%o
  9.     if "!Arr!"=="" (ENDLOCAL&goto :Loop2)
  10.     ENDLOCAL&goto :Loop1
  11. )
  12. :Loop2
  13. for /f "delims=" %%i in () do (set "i=%%i"
  14.     SETLOCAL ENABLEDELAYEDEXPANSION
  15.     ::1 特殊符号,必加转义字符
  16.     set i=!i:%%=!
  17.     set i=!i:^^=!
  18.     set i=!i:^&=!
  19.     set i=!i:^(=!
  20.     set i=!i:^)=!
  21.     set i=!i:^|=!
  22.     set i=!i:^<=!
  23.     set i=!i:^>=!
  24.     ::2 普通符号,可以不加转义(建议加)
  25.     set i=!i:,=!
  26.     set i=!i:@=!
  27.     set i=!i:#=!
  28.     set i=!i:$=!
  29.     set i=!i:_=!
  30.     set i=!i:+=!
  31.     set i=!i:{=!
  32.     set i=!i:}=!
  33.     set i=!i::=!
  34.     set i=!i:"=!
  35.     set i=!i:?=!
  36.     set i=!i:-=!
  37.     set i=!i:[=!
  38.     set i=!i:]=!
  39.     set i=!i:;=!
  40.     set i=!i:'=!
  41.     set i=!i:\=!
  42.     set i=!i:.=!
  43.     set i=!i:/=!
  44.     ::3 文件名不许出现的
  45.     set i=!i:LPT=!
  46.     set i=!i:COM=!
  47.     set i=!i:NUL=!
  48.     set i=!i:AUX=!
  49.     set i=!i:PRN=!
  50.     set i=!i:CON=!
  51.     echo.!i!>TextTemp
  52. )
  53. pause
复制代码
——————————————————————————————————————
扩展  文件名不包含以下任何字符:
下划线开头或结尾" . * < > ? / : \ 表情 | 连字符 CON PRN AUX NUL COM1到9 LPT1到9
最长255个字符
作者: fzp070    时间: 2022-10-16 23:35

回复 4# o小奏o


    确实,叹号还是用set比较好
作者: 暴牙弟    时间: 2023-6-15 11:19

我想删除斜杆怎么办  /




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2