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

[文本处理] 批处理如何实现对指定字符串所在行的下一行内容进行替换?

[复制链接]
发表于 2016-6-29 13:21:45 | 显示全部楼层 |阅读模式
初始文本如下
123321
123333
454

!!@#$%^&*()
454


;compiler time


;;;;;;;;;;
需求

指定字符串是;compiler time
需要在这个字符串的下一行进行数据替换,并且保留一切空格,换行等特殊符号
如第一次执行批处理文件之后
123321
123333
454

!!@#$%^&*()
454


;compiler time
20160629120030

;;;;;;;;;;
第二次执行批处理文件之后
123321
123333
454

!!@#$%^&*()
454


;compiler time
20160629123000

;;;;;;;;;;
替换的文本为时间戳,自己试着弄了一下,该部分已经实现。
目前的代码的问题就是随着执行次数会不断的插入时间戳,而不是替换效果。
要求时间戳随着执行批处理后替换更新,而不是增加一行。
自己的弄的代码执行两次后如下
123321
123333
454

!!@#$%^&*()
454


;compiler time
20160629131619
20160629131614

;;;;;;;;;;

文本附上

折腾了好几天都不知道怎么弄,虽然sed可以实现。可是要求不能使用外部程序。
希望有大神解救!感谢!

---------------------------UPDATE
东拼西凑了一段还是算是解决了。。。
可是这个code每次使用的时候会覆盖掉;compiler time这一行,无法在这一行后面添加字段。这无法解
  1. @echo off & setlocal enabledelayedexpansion
  2. set "s=&echo;"
  3. set fn=123\rambin.nvr
  4. set times=%TIME:~0,2%
  5. set zero=0
  6. if %times% LSS 10 (set times=%zero%%TIME:~1,2%) else (set times=%TIME:~0,2%)
  7. set alltimes=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%%times:~0,2%%TIME:~3,2%%TIME:~6,2%
  8. for /f "delims=:" %%a in ('findstr /n ";compiler time" %fn%') do set n=%%a
  9. set /a n+=1
  10. (for /f "tokens=1,* delims=:" %%i in ('findstr /n ".*" %fn%') do if not %%i equ %n% echo.%%j)>"temp.txt"
  11. move /y temp.txt "%fn%"
  12. (for /f "delims=" %%a in ('findstr /n .* "%fn%"') do (
  13. for /f "tokens=1* delims=:" %%b in ("%%a")do (
  14. set "str=%%c"
  15. if "!str:~1,13!" == "compiler time"  ( echo ;compiler time%s%%alltimes% ) else (echo,%%c)
  16. )))>"temp.txt"
  17. move /y temp.txt "%fn%"
  18. :pause
复制代码

评分

参与人数 1PB -2 收起 理由
pcl_test -2 未按版规发帖

查看全部评分

发表于 2016-6-29 18:37:09 | 显示全部楼层
  1. @echo off

  2. for /f %%i in ('wmic os get LocalDateTime ^| findstr [0-9]') do set "dt=%%~ni"

  3. for /f "delims=" %%i in ('findstr /n .* a.txt') do (
  4.     set "当前行=%%i"
  5.     setlocal enabledelayedexpansion
  6.     set "当前行=!当前行:*:=!"
  7.     set "上一行=!上一行:*:=!"
  8.     if /i "!上一行!" == ";compiler time" (echo;%dt%) else (echo;!当前行!)
  9.     endlocal
  10.     set "上一行=%%i"
  11. )
  12. pause
复制代码
发表于 2016-6-30 20:50:58 | 显示全部楼层
本帖最后由 pcl_test 于 2016-6-30 20:52 编辑
  1. //&cls&cscript -nologo -e:jscript "%~f0" "文本.txt"&pause&exit
  2. function Add(i){return i<10?"0"+i:i;}
  3. var now = new Date();
  4. var dt = now.getFullYear()+Add((now.getMonth()+1))+
  5.     Add(now.getDate())+
  6.         Add(now.getHours())+
  7.             Add(now.getMinutes())+
  8.                 Add(now.getSeconds());
  9. var str = ';compiler time';  //指定字符串
  10. var fso = new ActiveXObject('Scripting.Filesystemobject');
  11. var file = WSH.Arguments(0);
  12. var f = fso.OpenTextFile(file, 1);
  13. var i=0, txt='';
  14. while(!f.AtEndOfStream){
  15.     var line = f.Readline();
  16.     i++;
  17.     if(i == t)continue;
  18.     if(line.indexOf(str) >-1){
  19.         txt += line+'\r\n'+dt+'\r\n';
  20.         var t = i+1;
  21.     }else{
  22.         txt += line+'\r\n';
  23.     }
  24. }
  25. f.Close();
  26. fso.OpenTextFile(file, 2).Write(txt);
  27. WSH.echo('Done');
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-20 00:42 , Processed in 0.028097 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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