Board logo

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

作者: ridora    时间: 2016-6-29 13:21     标题: 批处理如何实现对指定字符串所在行的下一行内容进行替换?

初始文本如下
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

;;;;;;;;;;

文本附上
[attach]9891[/attach]
折腾了好几天都不知道怎么弄,虽然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
复制代码

作者: WHY    时间: 2016-6-29 18:37

  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
复制代码

作者: pcl_test    时间: 2016-6-30 20:50

本帖最后由 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');
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2