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

[文本处理] [已解决]批处理如何批量删除不包含指定字符的行?

[复制链接]
发表于 2021-2-23 20:01:27 | 显示全部楼层 |阅读模式
本帖最后由 DDDYJQ1 于 2021-2-24 20:27 编辑

目录下有许多TXT文件,如何批量删除不包含指定字符,。“”?!的行?
就是说删除不含有,。“”?!这六个标点符号的行,只要含有其中一个就不删除。即把这种只有文字没有符号的行删除

罗苴子罗苴佐罗罗卫罗卧泼罗秉忠罗洛浑罗统一罗振玉罗晟炎罗常培罗福成罗福苌罗殿国罗槃国罗槃城罗玛部落罗布林卡罗布策旺罗打鼓羌罗苴子统罗施鬼国罗洪点都罗垒云端罗桑云丹罗桑四朗罗桑年扎罗桑赤烈罗桑旺秀罗桑图托罗桑索巴
发表于 2021-2-23 20:18:12 | 显示全部楼层
  1. for /f %%g in ('dir /b/on *.txt') do (
  2.   type "%%g"|findstr /i ", 。“ ” ? !">>temp.txt
  3.   move /y temp.txt "%%g"
  4.   )
复制代码
 楼主| 发表于 2021-2-23 21:14:08 | 显示全部楼层
对,就是这样。谢谢!
再加个要求,这没有符号的行,如果出现在倒数第一行或在倒数第二行就删除,否则就不删除。可以做到吗?要怎么改进?先谢了!
发表于 2021-2-23 21:52:34 | 显示全部楼层
你是说只删除倒数第一行和倒数第二行符合要求的行吗?
 楼主| 发表于 2021-2-23 22:30:44 | 显示全部楼层
对的,有没有办法改进?
发表于 2021-2-23 22:49:58 | 显示全部楼层
效率应当不算高,未经测试。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in (*.txt) do (
  4.     for /f %%x in ('type "%%a"^|find /c /v ""') do set m1=%%x&set /a m2=m1-1
  5.     set n=0
  6.     (for /f "delims=" %%i in ('type "%%a"') do (
  7.         set /a n+=1
  8.         set str=%%i
  9.         for %%y in (, 。 “ ” ? !) do set str=!str:%%y=!
  10.         if not !n!==!m1! if not !n!==!m2! echo,%%i
  11.         if !n!==!m1! if not "!str!"=="%%i" echo,%%i
  12.         if !n!==!m2! if not "!str!"=="%%i" echo,%%i
  13.     ))>#%%a
  14. )
  15. pause
复制代码
 楼主| 发表于 2021-2-23 23:13:27 | 显示全部楼层
可以,谢谢!最好效率高一点
发表于 2021-2-24 06:56:23 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2021-2-24 07:00 编辑

回复 7# DDDYJQ1
这样可能效率要高一点,只有这水平了:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in (*.txt) do (
  4.     for /f %%x in ('type "%%a"^|find /c /v ""') do set /a m=%%x-1
  5.     set n=0
  6.     (for /f "delims=" %%i in ('type "%%a"') do (
  7.         set /a n+=1
  8.         if !n! lss !m! (
  9.             echo,%%i
  10.         ) else (
  11.             set str=%%i
  12.             for %%y in (, 。 “ ” ? !) do set str=!str:%%y=!
  13.             if not "!str!"=="%%i" echo,%%i
  14.         )
  15.     ))>#%%a
  16. )
  17. pause
复制代码
发表于 2021-2-24 14:57:10 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2021-2-26 10:15 编辑

这样效率应当可以,用到了临时文件:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in (*.txt) do (
  4.     set n=0
  5.     (for /f "delims=" %%i in ('type "%%a"^|sort /+100') do (
  6.         set /a n+=1
  7.         if !n! lss 3 (
  8.             set str=%%i
  9.             for %%y in (, 。 “ ” ? !) do set str=!str:%%y=!
  10.             if not "!str!"=="%%i" echo,%%i
  11.         ) else (
  12.             echo,%%i
  13.         )
  14.     ))>a.temp
  15. sort /+100 a.temp>#%%a
  16. )
  17. del a.temp
  18. pause
复制代码
发表于 2021-2-24 15:00:13 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2021-2-24 15:58 编辑

如果每行字符较多,可以将sort /+100的数增加,比如sort /+1000。总而言之sort后面的数字一定要大于最长行的字符数。
 楼主| 发表于 2021-2-24 19:13:23 | 显示全部楼层
好用,谢谢
发表于 2021-2-24 22:24:35 | 显示全部楼层
本帖最后由 cutebe 于 2021-2-24 22:25 编辑

虽然结帖了,但还是贴个三方sed的,交流学习下。注意备份原文本文件!
  1. ::文本倒数两行如不包含中文标点则删除。
  2. @echo off

  3. ::删除不含六中文标点的行
  4. ::sed "/,\|。\|“\|”\|?\|!/!d" sample.txt

  5. for %%f in (*.txt)do for /f "delims=" %%n in ('sed -n "$=" "%%f"')do (
  6.         set line=%%n
  7.         call :Last2no "%%f" line-1
  8. )
  9. goto :eof

  10. ::最后两行若不含六中文标点,则删除
  11. :Last2no file L2
  12. set/aL2=%2
  13. sed -i "%L2%,${/,\|。\|“\|”\|?\|!/!d}" %1
  14. goto :eof
复制代码
发表于 2021-2-24 22:55:17 | 显示全部楼层
回复 12# cutebe


    如果文本只有一行,那么倒数第二行=0了
发表于 2021-2-24 23:13:14 | 显示全部楼层
是没有考虑单行情况!
发表于 2021-2-25 08:39:02 | 显示全部楼层
文本内容千变万化,写代码按通常情况即可,考虑太多这代码就复杂了,可根据具体情况进行调整。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-20 10:45 , Processed in 0.021550 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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