标题: [文本处理] [已解决]批处理怎么删除不同文件夹中的文本文件中的#连同#之内的字符与文本#? [打印本页]
作者: cxq00 时间: 2023-11-24 19:51 标题: [已解决]批处理怎么删除不同文件夹中的文本文件中的#连同#之内的字符与文本#?
本帖最后由 cxq00 于 2024-9-26 18:14 编辑
怎么批量处理同一目录下不同文件夹中的文本文件中的#连同#之内的字符与文本#
原文本是这样的:
总而言之,很多学校食堂阿姨都有手抖的毛病,所以遇到这种情况时,就别再责怪食堂阿姨了,她们也是有苦衷的!
所以,我们都是打工人,都相互体谅一下吧!#校园食堂趣事# #大学生食堂贵吗# #食堂的那些事# #学校饭菜加价# #你喜欢吃食堂吗#
我要的效果是删除掉包含##这其中的文字:
总而言之,很多学校食堂阿姨都有手抖的毛病,所以遇到这种情况时,就别再责怪食堂阿姨了,她们也是有苦衷的!
所以,我们都是打工人,都相互体谅一下吧!
解决方案:
powershell -c "dir -Directory|dir -Filter \"*.txt\"|foreach{(gc $_.FullName) -replace '#.*?#'|sc $_.FullName}"
作者: Batcher 时间: 2023-11-24 21:52
回复 1# cxq00
请给一个真实的例子说明一下你的需求吧,比如操作之前是怎样的,操作之后变成啥样?
如果需要上传文件,请用使用网盘。
如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: cxq00 时间: 2023-11-25 16:58
回复 2# Batcher
原文本是这样的:
总而言之,很多学校食堂阿姨都有手抖的毛病,所以遇到这种情况时,就别再责怪食堂阿姨了,她们也是有苦衷的!
所以,我们都是打工人,都相互体谅一下吧!#校园食堂趣事# #大学生食堂贵吗# #食堂的那些事# #学校饭菜加价# #你喜欢吃食堂吗#
我要的效果是删除掉包含##这其中的文字:
总而言之,很多学校食堂阿姨都有手抖的毛病,所以遇到这种情况时,就别再责怪食堂阿姨了,她们也是有苦衷的!
所以,我们都是打工人,都相互体谅一下吧!
作者: buyiyang 时间: 2023-11-25 17:36
将当前目录下若干文件夹的txt文件中由一对#包裹的字符串及该对#删除- powershell -c "dir -Directory|dir -Filter \"*.txt\"|foreach{(gc $_.FullName) -replace '#.*?#'|sc $_.FullName}"
复制代码
作者: cxq00 时间: 2023-11-25 17:47
回复 4# buyiyang
大佬, 这个怎么使用
作者: cxq00 时间: 2023-11-25 17:54
回复 4# buyiyang
我只会bat文件,你这个是直接用powershell吗? 感谢您的回复
作者: huxudao 时间: 2023-11-25 22:53
回复 1# cxq00
同问
作者: /zhqsystem/zhq 时间: 2023-11-25 22:55
本帖最后由 /zhqsystem/zhq 于 2023-11-25 23:04 编辑
- rem 特别说明:#号不能连续,又发现一处错误#也不能在开始字段,凑合用吧,来回减字符数字实在是烧脑
- if /i "%~f1"=="" echo,错误请拖拽运行或是调用[+路径]运行&timeout.exe /t 10&exit
- >"%~f1.tmp" (
- for /f "delims=" %%i in ('type "%~f1"')do (
- set "#=%%i"
- call:1
- call:2 "%~f1"
- )
- )
- goto:eof
- :1
- for /l %%n in (0,1,8192)do if /i "!#:~%%n,1!"=="" set/a "$_All=%%n"&&goto:eof
- goto:eof
- :2
- set "n=0"
- for /l %%n in (0,1,!$_All!)do if /i "!#:~%%n,1!"=="#" set/a "n+=1"&&set "$_!n!=%%n"
- set/a "o=!n!%%2"
- if /i "!o!"=="0" (call:3)else (echo,!#!)&&rem 符号不成组直接导出
- goto:eof
- :3
- set "#_tmp=!#!"
- set/a "nn=!n!+2"&&rem 修正段
- for /l %%n in (1,1,!nn!)do if defined #_tmp for /f "tokens=1,2,* delims=#" %%x in ("!#_tmp!")do (
- if /i not "%%y"=="" set "#_tmp=%%x%%z"
- )
- echo,!#_tmp!
- goto:eof
复制代码
作者: pd1 时间: 2023-11-25 23:29
回复 5# cxq00
上面的代码保存到一个.bat文件里运行就行
作者: cxq00 时间: 2023-11-26 09:58
回复 8# /zhqsystem/zhq
谢谢您的帮助,我去试试
作者: cxq00 时间: 2023-11-26 09:58
回复 9# pd1
好的,非常感谢
作者: cxq00 时间: 2023-11-26 10:07
回复 9# pd1
请问下这个是什么语言写的
作者: ShowCode 时间: 2023-11-26 11:05
回复 12# cxq00
4楼的代码是在BAT脚本里面调用的PowerShell
作者: cxq00 时间: 2023-11-26 18:21
回复 13# ShowCode
哦哦,好的,谢谢!!
作者: aloha20200628 时间: 2023-11-27 15:52
本帖最后由 aloha20200628 于 2024-6-6 22:31 编辑
一。不写一堆纯P代码,就要用其他手段代劳。系统原装的 jscript 或外部资源如 python、sed.exe 等可以逐步简化一楼示例的解法》
以下6行代码存为批处理脚本运行》cmd+jscript混编- @set @v=1 /*
- @echo off
- for /f "delims=" %%F in ('dir/b/s/a-d *.txt') do (type "%%~F"|cscript /e:javascript "%~f0">"%%~F.new")
- exit/b
- */
- lines=WSH.stdin.readall().replace(/#[^#]*#/g, ''); WSH.echo(lines);
复制代码
以下5行代码存为批处理脚本运行》假设系统已经预装python- @echo off
- for /f "delims=" %%F in ('dir/b/s/a-d *.txt') do (
- type "%%~F"|python -c "import sys,re;s=sys.stdin.read();print(re.sub('#[^#]*#','',s,re.S))">"%%~F.new"
- )
- exit/b
复制代码
以下2行代码存为批处理脚本运行》假设sed.exe已被下载安装在系统路径- @echo off &for /f "delims=" %%F in ('dir/b/s/a-d *.txt') do (sed "s/#[^#]*#//g" "%%~F">"%%~F.new")
- exit/b
复制代码
二。再给一段纯P代码》未发现内置的字符串操作捷径,只能用纯P的基本方法,先获取字符串长度再逐字判断以求目标结果... 此法虽然基本但确有灵活性,可有多种字符串处理用途。
以下代码存为批处理脚本运行》- @echo off &setlocal enabledelayedexpansion
- for /f "delims=" %%F in ('dir/b/s/a-d *.txt') do (
- (for /f "usebackq delims=" %%s in ("%%~F") do (
- set "cut=-1" &set "_s=" &set "s=%%~s" & (call :_strLen s sl)
- for /L %%i in (0,1,!sl!) do (
- set "c=!s:~%%i,1!"
- if "!c!" neq "#" (if !cut! equ -1 set "_s=!_s!!c!") else (set/a "cut=0-!cut!")
- )
- echo,!_s!
- ))>"%%~F.new"
- )
- endlocal&exit/b
-
- :_strLen //获取字符串长度(须开启变量延迟可保全^!等字符) %1=字符串变量名 %2=返回值变量名
- set "_str=_!%~1!" &set "_Len=0"
- for %%n in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
- if "!_str:~%%n,1!" neq "" (set/a "_Len+=%%n"&set "_str=!_str:~%%n!")
- )
- set "%~2=!_Len!" &exit/b
复制代码
作者: terse 时间: 2023-11-27 16:49
也来个纯P,尽量处理特殊字符吧- @echo off
- for /f "delims=" %%f in ('dir/b/s/a-d *.txt') do (
- (for /f "usebackq tokens=1* delims=#" %%i in ("%%f") do (
- set "str=%%i"
- set "s=%%j"
- if "%%j" neq "" (
- call :loop
- setlocal enabledelayedexpansion
- echo !str!
- endlocal
- ) else echo %%i
- ))>"New_%%~nf.tx"
- )
- pause
- exit
- :loop
- if "%s%" == "" goto :eof
- for /f "tokens=2* delims=#" %%i in ("%s%") do (
- set "t=%%i"
- set "s=%%j"
- setlocal enabledelayedexpansion
- if "!t: =!" neq "" set "str=!str!!t!"
- for /f "delims=" %%a in ("!str!") do endlocal&set "str=%%a"
- call :loop
- )
复制代码
第三方gawk 处理子目录 要加FOR- gawk "{gsub(/#[^#]*#/, \"\"); print >>FILENAME\"NEW_tx\"}" *.txt
复制代码
作者: aloha20200628 时间: 2023-11-27 18:00
订正了15楼代码。其中jscript和python脚本因均以文件而非行作为处理单位,故可有效解析定界符内容被断行的情况。
作者: Five66 时间: 2023-11-28 02:35
本帖最后由 Five66 于 2023-11-28 06:34 编辑
来个偷懒的,保存为ansi编码的bat
仅处理当前路径中文件夹里的文本文件
要求文本文件编码为gbk,文件名不要有英文百分号或936代码页无法显示的字符,还有文本中如果包含^可能会被吞
改了下,已最大程度支持特殊字符(大概)- @echo off&chcp 936 >nul
-
- for /d %%a in (*) do (
- for /f "delims=" %%b in ('dir /b /s /a-d "%%a\*.txt"') do (
- setlocal
- for /f "delims=" %%c in ('findstr /n .* "%%b"') do (
- set "line=%%c"
- setlocal enabledelayedexpansion
- if "!line:*:=!" == "" (endlocal&echo,) else (
- set "line=!line:*:=!"
- for /f "delims=" %%i in ("$!line:#=^#!") do endlocal&set "line=%%i"
- set o=
- call :aaa
- )
- )
- endlocal
- )>"%%~dpb_new_%%~nxb"
- )
- pause&exit/b
-
- :aaa
- setlocal enabledelayedexpansion
- set "line=!line:~1!"
- for /f "tokens=1* delims=^" %%x in ("$!line!") do (
- endlocal&set line=&set "tk1=%%x"&set "tk2=%%y"
- )
- setlocal enabledelayedexpansion
- set "tk1=!tk1:~1!"
- if "!tk1:~0,1!" == "#" (
- if "!tk2:~0,1!" == "#" (set "line=!tk2:~1!") else set "o=!o!!tk1!"&set "line=!tk2!"
- ) else (
- set "o=!o!!tk1!"
- set "line=!tk2!"
- )
- if defined line (
- for /f "delims=" %%i in ("$!line!") do (
- for /f "delims=" %%j in (""!o!"") do endlocal&set "line=%%i"&set "o=%%~j"
- )
- goto :aaa
- ) else echo,!o!&endlocal
- goto :eof
复制代码
作者: aloha20200628 时间: 2023-11-28 14:15
本帖最后由 aloha20200628 于 2023-11-28 14:25 编辑
一楼示例中没有那些 ^&!%()<\|/> 等特殊字符作祟,故15楼的纯P代码可以应付,当然 jscript/python/sed 等解决方案可以对此无惧。
若真要考虑纯P解法能处理上述特殊字符,还须订正其中的代码(包括字符串长度获取函数)如下》
按一楼示例原意顺便改写一个包含特殊字符的测试样本 test.txt:
'~^&!%(#将被删除#)<\|/>
'~^&!%()<\|/>#将被删除#
#将被删除#'~^&!%()<\|/>- @echo off
- for /f "delims=" %%F in ('dir/b/s/a-d *.txt') do (
- (for /f "usebackq delims=" %%s in ("%%~F") do (
- set s=%%~s
- setlocal enabledelayedexpansion
- set "cut=-1" &set "_s=" &(call :_strLen s sL)
- for /L %%i in (0,1,!sL!) do (
- set "c=!s:~%%i,1!"
- if "!c!" neq "#" (if !cut! equ -1 set "_s=!_s!!c!") else (set/a "cut=0-!cut!")
- )
- (echo,!_s!)
- endlocal
- ))>"%%~F.new"
- )
- endlocal &exit/b
-
- :_strLen //获取字符串长度(须先开启变量延迟可保全^!等特殊字符) %1=被测字符串变量名 %2=返回值变量名
- set "_str=_!%~1!" &set "Len=0"
- for %%n in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
- if "!_str:~%%n,1!" neq "" (set/a "Len+=%%n"&set "_str=!_str:~%%n!")
- )
- set/a "%~2=!Len!-1" &exit/b
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |