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

[文本处理] 【已解决】求助,批处理如何快捷的批量删除某个变量中的指定字符

[复制链接]
发表于 2024-8-16 21:09:36 | 显示全部楼层 |阅读模式
本帖最后由 蚯蚓传奇 于 2024-8-21 12:05 编辑

我想做的是用户输入一段话,然后用批处理自动去除句子中的停用词,我是这样写的:
  1. @echo off
  2. set /p a=:
  3. set "a=%a:!=%"
  4. set "a=%a:?=%"
  5. set "a=%a:。=%"
  6. set "a=%a::=%"
  7. ...
  8. echo %a%
  9. pause>nul
  10. exit
复制代码
但是这样做的效率太低了
请问各位大神能不能帮我把这段代码优化一下,谢谢
发表于 2024-8-16 22:32:35 | 显示全部楼层
本帖最后由 77七 于 2024-8-17 18:52 编辑

楼主写的其实挺好的,简单可靠。如以下这样写,此贴中提到的用call set 赋值,弊大于利。
  1. @echo off
  2. set /p a=:
  3. for %%i in ("!" "?" "。") do (
  4.         call set "a=%%a:%%~i=%%"
  5. )
  6. echo %a%
  7. pause
  8. exit
复制代码
代码错误,请参考3楼。
发表于 2024-8-17 09:29:04 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-8-17 10:42 编辑

回复 1# 蚯蚓传奇
回复 2# 77七

for %%c in ( ... ) 这个句式不能用于 ? 和 * 这两个系统默认的通配符
字符串替换函数也不能替换 = 和 * 这两个字符
以下给出两个纯P版本实现批量替换...
版本一:
其中命令行参数中若采用 & 作为置换字符须用双引号包裹

  1. @echo off &setlocal
  2. set "s=zxc!123?qwe:789。mnb&456"
  3. call :xxx ! ? 。 : "&"
  4. echo,%s%
  5. endlocal&pause&exit/b
  6. :xxx
  7.    if "%~1"=="" exit/b
  8.    call set "s=%%s:%~1=%%"
  9.    shift /1 & goto :xxx
复制代码
版本二:
多个置换字符用一个字符串链表表达,其中的分隔符采用 * 或采用 =,这两个均是替换函数禁用的字符

  1. @echo off &setlocal
  2. set "s=zxc!123?qwe:789。mnb&456"
  3. set "cs=!*?*。*:*&"
  4. :Loop
  5. for /f "tokens=1* delims=*" %%a in ("%cs%") do set "cs=%%b"&call set "s=%%s:%%a=%%"
  6. if "%cs%" neq "" goto :Loop
  7. echo,%s%
  8. pause&exit/b
复制代码

评分

参与人数 2技术 +2 收起 理由
蚯蚓传奇 + 1 感谢分享
77七 + 1 感谢分享

查看全部评分

发表于 2024-8-17 10:01:50 | 显示全部楼层
用 sed
  1. echo %a% | sed -r -e '/s/[!?]/'
复制代码
或者用powershell
发表于 2024-8-17 10:14:38 | 显示全部楼层
回复 4# newswan


   
大佬,我用这个代码报错
  1. sed: -e expression #1, char 1: unknown command: `''
复制代码


版本是sed (GNU sed) 4.8
发表于 2024-8-17 11:36:08 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-8-17 11:47 编辑


下载 sed.exe 如下 cmd 窗口一行流测试通过...

  1. echo,"zxc!123?qwe:789。mnb&456^iop%()" | sed -r "s/[!\?。\:&^%%]//g"
复制代码
用纯P代码修理那些特殊字符确实须费心思,很容易 ‘触雷入坑’,借助外部方法可以轻松拿下,最简之道如 powershell 或 sed.exe,只不过前者首启略慢,后者则须预下载...
以下是批处调用 powershell 方法实现特殊字符替换的示例代码...

  1. @echo off &setlocal
  2. set "s=zxc!123?qwe:789。mnb&456^iop%()"
  3. echo,"%s%"
  4. for /f "delims=" %%s in ('powershell " '%s%' -replace '[!\?。\:&^%%]' " ') do set "s=%%s"
  5. echo,"%s%"
  6. endlocal&pause&exit/b
复制代码

评分

参与人数 2技术 +2 收起 理由
蚯蚓传奇 + 1 感谢大佬的分享,已采纳
77七 + 1 感谢分享

查看全部评分

发表于 2024-8-17 11:39:35 | 显示全部楼层
回复 5# 77七

哎呀,手机上输入的,搞错了

后面应该是 's/[!?]//g'

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2026-3-17 21:07 , Processed in 0.011156 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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