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

[文本处理] 批处理怎样替换文本指定内容?

[复制链接]
发表于 2018-11-28 14:25:37 | 显示全部楼层 |阅读模式
在目录下我有有些文本如下
&ACCESS
;******BATHOME*******
BATHOME(NET589WP1234,666666,ACTION)
BATHOME(NET892WP1256,666666,ACTION)
BATMAN(NET789WP1235_P1,666666,ACTION)
BATHOME(NET523WP1255,666666,ACTION)
BATHOME(NET589WP1266,666666,ACTION)
BATHOME(NET789WP1235_P1,666666,ACTION)

想要变成
BATHOME(NET589WP1234,5891234,ACTION)
BATHOME(NET892WP1256,8921256,ACTION)
BATMAN(NET789WP1235_P1,666666,ACTION)
BATHOME(NET523WP1255,5231255,ACTION)
BATHOME(NET587WP1266,5871266,ACTION)
BATHOME(NET789WP1235_P1,7891235,ACTION)

也就是把第二节NET后面的3位数字+WP后面的四位数字替换,第三节666666内容
还有一点就是只能替换BATHOME行,不能对batman进行替换
个人苦思冥想实在想不出,只能变其中一行后面就歇菜了
发表于 2018-11-28 16:23:15 | 显示全部楼层
BAT
  1. @set @n=0/*&echo off
  2. dir /a-d/s/b *.txt|cscript -nologo -e:jscript "%~f0"
  3. pause&exit /b */

  4. var fso=new ActiveXObject('scripting.FileSystemObject');

  5. while(!WSH.StdIn.AtEndOfStream)
  6. {
  7.         var result='';
  8.         file=WSH.StdIn.ReadLine();//取得文件名
  9.         fo=fso.OpenTextFile(file,1);//读取文件
  10.         while(!fo.AtEndOfStream)
  11.         {
  12.                 //正则,替换文件内容
  13.                 line=(fo.ReadLine()).replace(/(?=BATHOME)(.*NET(\d{3})WP(\d{4}).*,)\d+(,.*)/gi,'$1$2$3$4');
  14.                 result+=line+'\r\n';//保存结果
  15.         }
  16.         fo.close();
  17.         file+='.log';
  18.         fo=fso.CreateTextFile(file,true,false);//创建文件
  19.         fo.Write(result);//输出结果
  20.         fo.close();
  21. }
复制代码

评分

参与人数 1技术 +1 收起 理由
786021512 + 1 感谢给帖子标题标注[已解决]字样 写法太高 ...

查看全部评分

发表于 2018-11-28 20:27:38 | 显示全部楼层
回复 1# 786021512


    把你写的只能变其中一行的代码发出来看看,我来帮忙修改。
 楼主| 发表于 2018-11-29 10:48:10 | 显示全部楼层
回复 3# Batcher
  1.     @echo off%
  2. setlocal enabledelayedexpansion

  3. for /f "tokens=*" %%k in ('dir /b test.txt') do  (
  4.          for /f %%l in ('type "%%k"') do set STR=%%l
  5.          for /f "tokens=2 delims=," %%j in ('find "BATHOME" "%%k"') do  set old=%%j
  6.          for /f "tokens=2 delims=(," %%i in ('find "BATHOME" "%%k"') do set new=%%i
  7.          set newa=!new:~3,3!
  8.                  set newc=!new:~8,4!
  9.                  
  10. )  
  11.          echo !STR:%old%=%newa%%newc%!


  12. )

  13. PAUSE
复制代码
好人呀
发表于 2018-11-29 11:47:27 | 显示全部楼层
回复 4# 786021512


外层for循环的dir命令可以去掉,直接type文件名就行。
多次find会导致效率较低,delims设置多个列分隔符就行了。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1-4 delims=(," %%a in ('type "1.txt" ^| findstr "(NET"') do (
  4.     set str=%%b
  5.     if "%%a" equ "BATHOME" (
  6.         echo %%a(%%b,!str:~3,3!!str:~8,3!,%%d
  7.     ) else (
  8.         echo %%a(%%b,%%c,%%d
  9.     )
  10. )
  11. pause
复制代码
 楼主| 发表于 2018-11-29 14:14:31 | 显示全部楼层
回复 5# Batcher
感谢!,但是我还想在请教一下,假设
BATHOME(NET589WP1234,666666,ACTION)
在ACTIO后面还有一节呢,这一节我是随机添加的

&ACCESS
;******BATHOME*******
BATHOME(NET589WP1234,666666,ACTION,GOOD)
BATHOME(NET892WP1256,666666,ACTION)
BATMAN(NET789WP1235_P1,666666,ACTION)
BATHOME(NET523WP1255,666666,ACTION,GOOD)
BATHOME(NET589WP1266,666666,ACTION)
BATHOME(NET789WP1235_P1,666666,ACTION)
怎样保留上面的信息并输出文本
当然还是要对666666这节进行更改
请谅解我啥都不懂
谢谢大神
发表于 2018-11-29 16:11:43 | 显示全部楼层
回复 6# 786021512


5楼代码
tokens=1-4
改成
tokens=1-3,*
 楼主| 发表于 2018-11-30 10:30:03 | 显示全部楼层
回复 7# Batcher
Thankyou,在请教下,我还想把整个文本给输出,该怎样做呢?
发表于 2018-11-30 11:33:21 | 显示全部楼层
回复 8# 786021512
  1. @echo off
  2. type "1.txt"
  3. pause
复制代码
 楼主| 发表于 2018-11-30 12:43:29 | 显示全部楼层
回复 9# Batcher


    额,我想说的是怎样结合你的代码,输出来..
发表于 2018-11-30 13:29:07 | 显示全部楼层
回复 10# 786021512


type "1.txt"
把这行命令加到5楼代码里面,挑个你喜欢的位置,比如第2行下面或者第10行下面。
 楼主| 发表于 2018-11-30 13:38:43 | 显示全部楼层
回复 11# Batcher [/b
我还是不太会,加了以后又是原样输出了,666666那一行有不变了
原谅我跟不上节奏
发表于 2018-11-30 14:10:01 | 显示全部楼层
回复 12# 786021512


    这个结果跟你8楼说的“还想把整个文本给输出”具体差异在哪里?
发表于 2018-11-30 14:14:30 | 显示全部楼层
回复 12# 786021512


如果你的意思是要把代码执行的结果输出到另外一个txt文件,可以试试这样:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=1-3,* delims=(," %%a in ('type "1.txt" ^| findstr "(NET"') do (
  4.     set str=%%b
  5.     if "%%a" equ "BATHOME" (
  6.         echo %%a(%%b,!str:~3,3!!str:~8,3!,%%d
  7.     ) else (
  8.         echo %%a(%%b,%%c,%%d
  9.     )
  10. ))>"2.txt"
复制代码
 楼主| 发表于 2018-11-30 14:28:22 | 显示全部楼层
回复 14# Batcher

我的意思把原来的文本内容进行替换并输出结果
原先内容中还含有标题
&ACCESS
等内容
现在只能输出更改的内容,原先的标题等会被去掉
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 21:33 , Processed in 0.020798 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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