标题: [文本处理] 【已解决】求助,批处理如何快捷的批量删除某个变量中的指定字符 [打印本页]
作者: 蚯蚓传奇 时间: 2024-8-16 21:09 标题: 【已解决】求助,批处理如何快捷的批量删除某个变量中的指定字符
本帖最后由 蚯蚓传奇 于 2024-8-21 12:05 编辑
我想做的是用户输入一段话,然后用批处理自动去除句子中的停用词,我是这样写的:- @echo off
- set /p a=:
- set "a=%a:!=%"
- set "a=%a:?=%"
- set "a=%a:。=%"
- set "a=%a::=%"
- ...
- echo %a%
- pause>nul
- exit
复制代码
但是这样做的效率太低了
请问各位大神能不能帮我把这段代码优化一下,谢谢
作者: 77七 时间: 2024-8-16 22:32
本帖最后由 77七 于 2024-8-17 18:52 编辑
楼主写的其实挺好的,简单可靠。如以下这样写,此贴中提到的用call set 赋值,弊大于利。- @echo off
- set /p a=:
- for %%i in ("!" "?" "。") do (
- call set "a=%%a:%%~i=%%"
- )
- echo %a%
- pause
- exit
复制代码
代码错误,请参考3楼。
作者: aloha20200628 时间: 2024-8-17 09:29
本帖最后由 aloha20200628 于 2024-8-17 10:42 编辑
回复 1# 蚯蚓传奇
回复 2# 77七
for %%c in ( ... ) 这个句式不能用于 ? 和 * 这两个系统默认的通配符
字符串替换函数也不能替换 = 和 * 这两个字符
以下给出两个纯P版本实现批量替换...
版本一:
其中命令行参数中若采用 & 作为置换字符须用双引号包裹- @echo off &setlocal
- set "s=zxc!123?qwe:789。mnb&456"
- call :xxx ! ? 。 : "&"
- echo,%s%
- endlocal&pause&exit/b
- :xxx
- if "%~1"=="" exit/b
- call set "s=%%s:%~1=%%"
- shift /1 & goto :xxx
复制代码
版本二:
多个置换字符用一个字符串链表表达,其中的分隔符采用 * 或采用 =,这两个均是替换函数禁用的字符- @echo off &setlocal
- set "s=zxc!123?qwe:789。mnb&456"
- set "cs=!*?*。*:*&"
- :Loop
- for /f "tokens=1* delims=*" %%a in ("%cs%") do set "cs=%%b"&call set "s=%%s:%%a=%%"
- if "%cs%" neq "" goto :Loop
- echo,%s%
- pause&exit/b
复制代码
作者: newswan 时间: 2024-8-17 10:01
用 sed- echo %a% | sed -r -e '/s/[!?]/'
复制代码
或者用powershell
作者: 77七 时间: 2024-8-17 10:14
回复 4# newswan
大佬,我用这个代码报错
- sed: -e expression #1, char 1: unknown command: `''
复制代码
版本是sed (GNU sed) 4.8
作者: aloha20200628 时间: 2024-8-17 11:36
本帖最后由 aloha20200628 于 2024-8-17 11:47 编辑
下载 sed.exe 如下 cmd 窗口一行流测试通过...- echo,"zxc!123?qwe:789。mnb&456^iop%()" | sed -r "s/[!\?。\:&^%%]//g"
复制代码
用纯P代码修理那些特殊字符确实须费心思,很容易 ‘触雷入坑’,借助外部方法可以轻松拿下,最简之道如 powershell 或 sed.exe,只不过前者首启略慢,后者则须预下载...
以下是批处调用 powershell 方法实现特殊字符替换的示例代码...- @echo off &setlocal
- set "s=zxc!123?qwe:789。mnb&456^iop%()"
- echo,"%s%"
- for /f "delims=" %%s in ('powershell " '%s%' -replace '[!\?。\:&^%%]' " ') do set "s=%%s"
- echo,"%s%"
- endlocal&pause&exit/b
复制代码
作者: newswan 时间: 2024-8-17 11:39
回复 5# 77七
哎呀,手机上输入的,搞错了
后面应该是 's/[!?]//g'
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |