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

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

本帖最后由 蚯蚓传奇 于 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
复制代码
但是这样做的效率太低了
请问各位大神能不能帮我把这段代码优化一下,谢谢

回复 5# 77七

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

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

评分人数

    • 77七: 感谢分享技术 + 1

TOP

本帖最后由 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

评分人数

TOP

回复 4# newswan


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


版本是sed (GNU sed) 4.8
bat小白,请多指教!谢谢!

TOP

用 sed
  1. echo %a% | sed -r -e '/s/[!?]/'
复制代码
或者用powershell

TOP

本帖最后由 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

评分人数

TOP

本帖最后由 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楼。
bat小白,请多指教!谢谢!

TOP

返回列表