标题: [文本处理] 批处理 删除文本中全部英文符号 [打印本页]
作者: o小奏o 时间: 2022-10-14 19:32 标题: 批处理 删除文本中全部英文符号
本帖最后由 o小奏o 于 2022-10-18 11:56 编辑
水个帖子
删除感叹号(只能用%%),注意要在for外面,for内部要操作变量要用到!- echo off&SETLOCAL ENABLEDELAYEDEXPANSION
- set /p a=<awa.txt
- set a=%a:!=%
复制代码
删除星号(单独用%% , 多次用!!),如果有多个星号就多叠几个吧。- set a=!a:**=!
- set a=!a:**=!
- ......
复制代码
删除百分号(只能用!!),同多个星号,一般多叠几个就够用了。- set a=!a:%%=!
- set a=!a:%%=!
- ......
复制代码
目前的平替方案就这样,其他好的再慢慢发掘
(以上只是作为入门级别的我的实践成果)
作者: fzp070 时间: 2022-10-14 20:24
本帖最后由 fzp070 于 2022-10-14 20:52 编辑
如下方法也可以试试,不过还有缺陷,如字符中有3个及以上!号时会丢失字符。
awa.txt内容为:复制代码
代码为:- @echo off
- setlocal enabledelayedexpansion
- set /p pp=<awa.txt
- echo;"!pp!"
-
-
- ::本次去除!号
- :Loop1
- for /f "tokens=1* delims=!" %%a in ("!pp!") do set "pp=%%a%%b"
- echo,"!pp!"|findstr "[!]">nul&&goto :Loop1
- echo,"!pp!"
-
-
- ::本次去除*号
- :Loop2
- for /f "tokens=1* delims=*" %%a in ("!pp!") do set "pp=%%a%%b"
- echo,"!pp!"|findstr "[*]">nul&&goto :Loop2
- echo,"!pp!"
-
-
- ::本次去除%号
- :Loop3
- for /f "tokens=1* delims=%%" %%a in ("!pp!") do set "pp=%%a%%b"
- echo,"!pp!"|findstr "[%]">nul&&goto :Loop3
- echo,"!pp!"
-
-
- ::本次去除?号
- :Loop4
- for /f "tokens=1* delims=?" %%a in ("!pp!") do set "pp=%%a%%b"
- echo,"!pp!"|findstr "[?]">nul&&goto :Loop4
- echo,"!pp!"
-
-
- ::本次去除=号
- :Loop5
- for /f "tokens=1* delims==" %%a in ("!pp!") do set "pp=%%a%%b"
- echo,"!pp!"|findstr "[=]">nul&&goto :Loop5
- echo,"!pp!"
-
-
- ::本次去除@号
- :Loop6
- for /f "tokens=1* delims=@" %%a in ("!pp!") do set "pp=%%a%%b"
- echo,"!pp!"|findstr "[@]">nul&&goto :Loop6
- echo,"!pp!"
-
- pause
复制代码
结果为:- "123@%*!456?=7!89"
- "123@%*456?=789"
- "123@%456?=789"
- "123@456?=789"
- "123@456=789"
- "123@456789"
- "123456789"
- 请按任意键继续. . .
复制代码
作者: pd1 时间: 2022-10-15 10:49
powershell简单些,不用考虑那么多- <# :
- @echo off
- powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0' |Out-String|Invoke-Expression"
- pause
- #>
- $a="123@%*!456?=7!89"
- $regex = [regex]"[^@%*?+!=]*"
- $s=""
- $result = $regex.Matches($a)
- $result |%{$s+=$_.Value}
- 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组合的办法:- delims !*=~ 和 findstr /n ^! ^* ^= ^~
- set 【%%】【^`】【^^】【^(】【^)】【^|】【^<】【^>】【@】【#】【$】【+】【{】【}】【:】【"】【?】【-】【[】【]】【;】【'】【\】【,】【.】【/】
复制代码
测试出来的小知识:关变量延迟->for中set->开变量延迟 可以让set突破1024字节的上限,达到8192字节
————————————————————————————————————————————————————————————————————————————
测试过的代码如下(处理单行的情况)
————————————————————————————————————————————————————————————————————————————- @ECHO OFF&SETLOCAL ENABLEDELAYEDEXPANSION
- chcp 65001>NUL
- :Loop1
- ENDLOCAL
- for /f "tokens=1* delims=!*=~" %%i in (TextTemp) do (set "i=%%i%%j"
- SETLOCAL ENABLEDELAYEDEXPANSION
- echo.!i!>TextTemp
- for /f "delims=" %%o in ('findstr /n "^! ^* ^= ^~" TextTemp') do set Arr=%%o
- if "!Arr!"=="" (ENDLOCAL&goto :Loop2)
- ENDLOCAL&goto :Loop1
- )
- :Loop2
- for /f "delims=" %%i in () do (set "i=%%i"
- SETLOCAL ENABLEDELAYEDEXPANSION
- ::1 特殊符号,必加转义字符
- set i=!i:%%=!
- set i=!i:^^=!
- set i=!i:^&=!
- set i=!i:^(=!
- set i=!i:^)=!
- set i=!i:^|=!
- set i=!i:^<=!
- set i=!i:^>=!
- ::2 普通符号,可以不加转义(建议加)
- set i=!i:,=!
- set i=!i:@=!
- set i=!i:#=!
- set i=!i:$=!
- set i=!i:_=!
- set i=!i:+=!
- set i=!i:{=!
- set i=!i:}=!
- set i=!i::=!
- set i=!i:"=!
- set i=!i:?=!
- set i=!i:-=!
- set i=!i:[=!
- set i=!i:]=!
- set i=!i:;=!
- set i=!i:'=!
- set i=!i:\=!
- set i=!i:.=!
- set i=!i:/=!
- ::3 文件名不许出现的
- set i=!i:LPT=!
- set i=!i:COM=!
- set i=!i:NUL=!
- set i=!i:AUX=!
- set i=!i:PRN=!
- set i=!i:CON=!
- echo.!i!>TextTemp
- )
- 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 |