标题: [文件操作] 批处理如何删除文本中每一行两个指定字符串之间的内容? [打印本页]
作者: wh1234567 时间: 2016-12-5 13:18 标题: 批处理如何删除文本中每一行两个指定字符串之间的内容?
本帖最后由 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发放
百度里搜索到和这个一样的问题,希望帮助
论坛里搜索了好多也没有找到,百度里也没有找到,是不是以前好多帖子删除过?
作者: GNU 时间: 2016-12-5 15:10
- @echo off
- (for /f "tokens=1-8 delims=-=" %%a in ('type "1.txt"') do (
- echo %%a----%%b----=%%h
- ))>2.txt
复制代码
文本处理这事情吧,你需要好好学习 for 命令的使用。
很难通过某个关键字搜索到一个代码正好能解决跟你一模一样的问题。
作者: wh1234567 时间: 2016-12-5 15:48
本帖最后由 wh1234567 于 2016-12-5 15:53 编辑
回复 2# GNU
处理有点不太准确,能不能按照2个关键词来处理,只删除关键词A到关键词B之间的内容即可。
删除每行“次----”字符到“=”字符之间的内容。
2个关键词允许设定,例如,开头关键词=“次----”,尾部关键词=“=”,然后下面就是处理代码
作者: CommandBatCmd 时间: 2016-12-5 16:36
回复 3# wh1234567 - @echo off
- :: gawk下载:http://www.bathome.net/s/tool/index.html?down&key=gawk
- :: 删除每行中“唯一”两个自定义“关键词”中间的内容。
- set "fs1=次----" ||@rem 开头关键词
- set "fs2==" ||@rem 尾部关键词
- set "a=1.txt"&set "b=2.txt"
- gawk -F"%fs1%" "NF>0{OFS=\"\";print $1,FS,\"%fs2%\",$2,$NF}" "%a%"|gawk -F"%fs2%" "{OFS=\"\";print $1 \"%fs2%\" $NF}" >"%b%"
- %b%
- pause
复制代码
作者: wh1234567 时间: 2016-12-5 20:03
本帖最后由 wh1234567 于 2016-12-5 20:28 编辑
回复 4# CommandBatCmd
非常感谢您的帮助,不想使用第三方程序的话,这个代码如何修正一下呢?
作者: CommandBatCmd 时间: 2016-12-5 20:55
回复 5# wh1234567
2楼的纯P,和4楼的第三方都已经解决了LZ的问题,
是不是真实处理的内容与附件中的不同,想用纯P来处理?
作者: wh1234567 时间: 2016-12-5 21:07
回复 6# CommandBatCmd
您好,您这个批处理处理效果很好,只是使用第三方程序感觉不太方便,想用纯批处理处理,另外2楼的纯批处理有问题,比如内容里多了一个“----”就会处理出错,所以,如果您这个思路的代码能弄成纯批处理的就更加完美了。
作者: CommandBatCmd 时间: 2016-12-5 21:40
本帖最后由 CommandBatCmd 于 2016-12-6 01:24 编辑
回复 7# wh1234567
按照LZ的想法(指定首尾两个字符串),弄一个纯P,可以说是把简单问题复杂化,
因为纯P对于“----”的内容,只能看成四个单独字符来处理,不好整体化(其实是纯P没有这个功能),
尤其是这样的字段长短不一时,用纯P设计起来特别的复杂,没有什么通用性,
要是用纯P弄出一个比较通用性的字符串处理程式,等我把本论坛的那些前辈大牛们的帖子研究透了再说吧!
脚本就是实际问题实际解决,比较灵活。
希望能够回答了LZ的问题。
作者: wh1234567 时间: 2016-12-5 23:25
本帖最后由 wh1234567 于 2016-12-5 23:26 编辑
回复 8# CommandBatCmd
我的意思是只要不使用第三方程序的批处理就行,设定的关键词用引号是不是就不会处理出错了?
作者: CommandBatCmd 时间: 2016-12-5 23:56
回复 9# wh1234567
加双引号不出错,这要看输入的字符串是否含有特殊字符,如:百分号、引号本身等等,
添加了双引号后,可多容纳几个特殊字符,但也解决不了随时遇到的情况,
LZ想搞成怎样,可先弄个P代码框架,需要解决那部分的问题,发上来,让坛友们帮帮你。
作者: /zhqsystem/zhq 时间: 2016-12-6 00:11
回复 1# wh1234567
- set "one=----"
- set "two=="
- for %%i in (one,two)do (
- for /l %%n in (0,1,8192)do if /i not "!%%~i:~%%n,1!"=="" set/a "%%~i_n=%%~n+1"
- echo,!%%~i_n!
- )
- for /f "delims=" %%i in ('type "%~dp0批处理如何删除文本中每一行两个指定字符串之间的内容.txt"')do (
- set "Character=%%i"
- set "n="
- set "new_one="
- set "new_two="
- for /l %%n in (0,1,8192)do if /i not "!Character:~%%~n,1!"=="" if /i "!Character:~%%~n,%one_n%!"=="!one!" (
- set/a "n+=1"
- if !n!==2 (
- set "new_one=!Character:~0,%%~n!"
- )
- )else if /i "!Character:~%%~n,%two_n%!"=="!two!" (
- set "new_two=!Character:~%%~n!"
- )
- echo,!new_one!!new_two!
- )
复制代码
作者: wh1234567 时间: 2016-12-6 00:30
回复 10# CommandBatCmd
就按照您这个思路写个通用批处理就行,很简洁,删除2个字符串之间的内容。楼下的我有点看不懂,好多年没学了,忘记了,唉
作者: CommandBatCmd 时间: 2016-12-6 02:24
回复 12# wh1234567
只要你喜欢纯P,根据前辈以及大牛们的建议,从for开始研究,这是纯P中最强已是最难的一个命令。
8楼的回答已经很明确,用纯P写一个通用的字符串处理程式,很难办到,起码对本人来说是这样的。
LZ是否又想重新亲近这个没规没矩、行为怪异,可爱又可怨的老不死?!
作者: Nsqs 时间: 2016-12-6 03:55
本帖最后由 Nsqs 于 2016-12-6 04:18 编辑
- ::on error resume next
- :sub class_bat
- echo off&cls
- cscript -nologo -e:vbs "%~0"
- pause
- exit sub
- :end sub
- set fso=createobject("scripting.filesystemobject")
- set regexp=new regexp
- File="123.txt"
- regexp.global=-1:regexp.ignorecase=-1
- regexp.pattern="([\u4e00-\u9fff0\w]*-{4}[\u4e00-\u9fff0\w]*-{4}).*(?==[\u4e00-\u9fff0\w]*)"
- read=fso.opentextfile(File).readall
- change=RegExp.Replace(read,"$1")
- wsh.echo "演示结果:"
- fso.createtextfile("new_"&File).write change
- wsh.echo change
- set fso=nothing:set regexp=nothing
复制代码
剔除A与B之间的字符串,不需要第三方.
作者: wh1234567 时间: 2016-12-6 12:37
回复 14# Nsqs
C:\新建文件夹\新建文件夹\批处理提取多个关键词行并按行排序输出 .bat(19, 5) Micros
oft VBScript 编译器错误: 无效的 'exit' 语句
请按任意键继续. . .
您这思路好像不太通用吧?遇到行内容形形色色的时候,就没法正常处理了吧?格式不固定,只要符合2个关键词,将之间的内容删除即可。
作者: wh1234567 时间: 2016-12-6 12:39
4楼老师的思路很好,只是需要第三方程序而已
作者: Nsqs 时间: 2016-12-6 12:51
回复 16# wh1234567
我的方法比楼上几位都好用,呵呵..你的意思你自己不会要怪别人不通用.代码贴出来自己不会改.写了十几行自己不会看还乱喷
作者: pcl_test 时间: 2016-12-6 16:05
11楼纯P的思路就不错,利用偏移获取两个指定字符串在行中的位置,再利用截取拼接字符串的方式得到结果,只是没有注重效率,不论字符串长短都让for跑个八千多次
作者: wh1234567 时间: 2016-12-6 22:08
本帖最后由 wh1234567 于 2016-12-6 22:09 编辑
回复 18# pcl_test
是的,运行时看到在不停循环,心疼电脑啊,呵呵呵,关键是我不会套用,没做成通用的那种。例如设定文本名称和输出文本名称。
作者: codegay 时间: 2016-12-7 10:43
所谓的爱纯P就是爱过来找人帮写代码。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |