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

[文件操作] 批处理如何删除文本中每一行两个指定字符串之间的内容?

[复制链接]
发表于 2016-12-5 13:18:48 | 显示全部楼层 |阅读模式
本帖最后由 wh1234567 于 2016-12-6 22:06 编辑

例如:
文本1.txt内容如下:
3 a到付vd323----2342次----563648545346----1231313----2014年12月23:22秒  3342多少次3+2vb宝贝+60492奎娥我-32百年vfd2----0030320(不方便方便的)=14+213发放
需要删除每行第二个“----”字符到最后面“=”字符之间的内容。并将结果输出到文本2.txt
或者说:删除每行“次----”字符到“=”字符之间的内容。
输出结果例如:
3 a到付vd323----2342次----=14+213发放
百度里搜索到和这个一样的问题,希望帮助
论坛里搜索了好多也没有找到,百度里也没有找到,是不是以前好多帖子删除过?
发表于 2016-12-5 15:10:01 | 显示全部楼层
  1. @echo off
  2. (for /f "tokens=1-8 delims=-=" %%a in ('type "1.txt"') do (
  3.     echo %%a----%%b----=%%h
  4. ))>2.txt
复制代码
文本处理这事情吧,你需要好好学习 for 命令的使用。
很难通过某个关键字搜索到一个代码正好能解决跟你一模一样的问题。
 楼主| 发表于 2016-12-5 15:48:40 | 显示全部楼层
本帖最后由 wh1234567 于 2016-12-5 15:53 编辑

回复 2# GNU

处理有点不太准确,能不能按照2个关键词来处理,只删除关键词A到关键词B之间的内容即可。
删除每行“次----”字符到“=”字符之间的内容。
2个关键词允许设定,例如,开头关键词=“次----”,尾部关键词=“=”,然后下面就是处理代码
发表于 2016-12-5 16:36:17 | 显示全部楼层
回复 3# wh1234567
  1. @echo off
  2. :: gawk下载:http://www.bathome.net/s/tool/index.html?down&key=gawk
  3. :: 删除每行中“唯一”两个自定义“关键词”中间的内容。
  4. set "fs1=次----"     ||@rem 开头关键词
  5. set "fs2=="          ||@rem 尾部关键词
  6. set "a=1.txt"&set "b=2.txt"
  7. gawk -F"%fs1%" "NF>0{OFS="";print $1,FS,"%fs2%",$2,$NF}" "%a%"|gawk -F"%fs2%" "{OFS="";print $1 "%fs2%" $NF}" >"%b%"
  8. %b%
  9. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
wh1234567 + 1 感谢朋友的帮助,代码很好

查看全部评分

 楼主| 发表于 2016-12-5 20:03:25 | 显示全部楼层
本帖最后由 wh1234567 于 2016-12-5 20:28 编辑

回复 4# CommandBatCmd


    非常感谢您的帮助,不想使用第三方程序的话,这个代码如何修正一下呢?
发表于 2016-12-5 20:55:46 | 显示全部楼层
回复 5# wh1234567


    2楼的纯P,和4楼的第三方都已经解决了LZ的问题,
是不是真实处理的内容与附件中的不同,想用纯P来处理?
 楼主| 发表于 2016-12-5 21:07:40 | 显示全部楼层
回复 6# CommandBatCmd

您好,您这个批处理处理效果很好,只是使用第三方程序感觉不太方便,想用纯批处理处理,另外2楼的纯批处理有问题,比如内容里多了一个“----”就会处理出错,所以,如果您这个思路的代码能弄成纯批处理的就更加完美了。
发表于 2016-12-5 21:40:53 | 显示全部楼层
本帖最后由 CommandBatCmd 于 2016-12-6 01:24 编辑

回复 7# wh1234567


    按照LZ的想法(指定首尾两个字符串),弄一个纯P,可以说是把简单问题复杂化,
因为纯P对于“----”的内容,只能看成四个单独字符来处理,不好整体化(其实是纯P没有这个功能),
尤其是这样的字段长短不一时,用纯P设计起来特别的复杂,没有什么通用性,
要是用纯P弄出一个比较通用性的字符串处理程式,等我把本论坛的那些前辈大牛们的帖子研究透了再说吧!
脚本就是实际问题实际解决,比较灵活。
希望能够回答了LZ的问题。
 楼主| 发表于 2016-12-5 23:25:21 | 显示全部楼层
本帖最后由 wh1234567 于 2016-12-5 23:26 编辑

回复 8# CommandBatCmd


    我的意思是只要不使用第三方程序的批处理就行,设定的关键词用引号是不是就不会处理出错了?
发表于 2016-12-5 23:56:02 | 显示全部楼层
回复 9# wh1234567


    加双引号不出错,这要看输入的字符串是否含有特殊字符,如:百分号、引号本身等等,
添加了双引号后,可多容纳几个特殊字符,但也解决不了随时遇到的情况,
LZ想搞成怎样,可先弄个P代码框架,需要解决那部分的问题,发上来,让坛友们帮帮你。
发表于 2016-12-6 00:11:06 | 显示全部楼层
回复 1# wh1234567
  1. set "one=----"
  2. set "two=="
  3. for %%i in (one,two)do (
  4. for /l %%n in (0,1,8192)do if /i not "!%%~i:~%%n,1!"=="" set/a "%%~i_n=%%~n+1"
  5. echo,!%%~i_n!
  6. )
  7. for /f "delims=" %%i in ('type "%~dp0批处理如何删除文本中每一行两个指定字符串之间的内容.txt"')do (
  8. set "Character=%%i"
  9. set "n="
  10. set "new_one="
  11. set "new_two="
  12. for /l %%n in (0,1,8192)do if /i not "!Character:~%%~n,1!"=="" if /i "!Character:~%%~n,%one_n%!"=="!one!" (
  13.   set/a "n+=1"
  14.   if !n!==2 (
  15.    set "new_one=!Character:~0,%%~n!"
  16.   )
  17. )else if /i "!Character:~%%~n,%two_n%!"=="!two!" (
  18.   set "new_two=!Character:~%%~n!"
  19. )
  20. echo,!new_one!!new_two!
  21. )
复制代码
 楼主| 发表于 2016-12-6 00:30:23 | 显示全部楼层
回复 10# CommandBatCmd

就按照您这个思路写个通用批处理就行,很简洁,删除2个字符串之间的内容。楼下的我有点看不懂,好多年没学了,忘记了,唉
发表于 2016-12-6 02:24:58 | 显示全部楼层
回复 12# wh1234567


   只要你喜欢纯P,根据前辈以及大牛们的建议,从for开始研究,这是纯P中最强已是最难的一个命令。
8楼的回答已经很明确,用纯P写一个通用的字符串处理程式,很难办到,起码对本人来说是这样的。
LZ是否又想重新亲近这个没规没矩、行为怪异,可爱又可怨的老不死?!
发表于 2016-12-6 03:55:59 | 显示全部楼层
本帖最后由 Nsqs 于 2016-12-6 04:18 编辑
  1. ::on error resume next
  2. :sub class_bat
  3.         echo off&cls
  4.         cscript -nologo -e:vbs "%~0"
  5.         pause
  6.         exit sub
  7. :end sub
  8. set fso=createobject("scripting.filesystemobject")
  9. set regexp=new regexp
  10. File="123.txt"
  11. regexp.global=-1:regexp.ignorecase=-1
  12. regexp.pattern="([\u4e00-\u9fff0\w]*-{4}[\u4e00-\u9fff0\w]*-{4}).*(?==[\u4e00-\u9fff0\w]*)"
  13. read=fso.opentextfile(File).readall
  14. change=RegExp.Replace(read,"$1")
  15. wsh.echo "演示结果:"
  16. fso.createtextfile("new_"&File).write change
  17. wsh.echo change
  18. set fso=nothing:set regexp=nothing
复制代码
剔除A与B之间的字符串,不需要第三方.
 楼主| 发表于 2016-12-6 12:37:42 | 显示全部楼层
回复 14# Nsqs

C:\新建文件夹\新建文件夹\批处理提取多个关键词行并按行排序输出 .bat(19, 5) Micros
oft VBScript 编译器错误: 无效的 'exit' 语句

请按任意键继续. . .



您这思路好像不太通用吧?遇到行内容形形色色的时候,就没法正常处理了吧?格式不固定,只要符合2个关键词,将之间的内容删除即可。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 14:26 , Processed in 0.021915 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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