Board logo

标题: [文件操作] 批处理替换文件内容,怎么将变量写入文本文件特定行? [打印本页]

作者: hehening88    时间: 2012-6-30 15:51     标题: 批处理替换文件内容,怎么将变量写入文本文件特定行?

测试文本文件1111.txt内容如下:
111111111
111"222"111
111111111
444444444
fgjjllkugf
目的是将第二行双引号中的222替换成8888888
替换结果如下:
111111111
111"88888888"111
111111111
444444444
fgjjllkugf
批处理代码如下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('type "1111.txt"^|find /n "222"') do
  4. set str=%%a
  5. for /f tokens^=1-2*delims^=^" %%i in ("%str%") do (
  6.   set substr=%%j
  7.   set replace=888888888
  8.   echo !substr!
  9.   call set "str=%%str:!substr!=!replace!%%"
  10.   echo !str!>>1111.txt
  11. )
  12. pause
复制代码
但执行结果确实将解析替换好的字符串111"888888888"111写到了文件最后一行
我觉得语句for /f "delims=" %%a in ('type "1111.txt"^|find /n "222"')是按行执行的,到文件第二行时发现字符串“222”,在执行到第三行之前,执行后面所有的语句,改成下面这样反而出现了语法错误,结果一闪就消失了
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('type "1111.txt"^|find /n "222"') do
  4. (
  5. set str=%%a
  6. for /f tokens^=1-2*delims^=^" %%i in ("%str%") do (
  7.   set substr=%%j
  8.   set replace=888888888
  9.   echo !substr!
  10.   call set "str=%%str:!substr!=!replace!%%"
  11.   echo !str!>>1111.txt
  12. )
  13. )
  14. pause
复制代码
前辈帮帮忙!能让最后这个变量echo !str!把原文本第二行替换掉
作者: weichenxiehou    时间: 2012-6-30 16:44

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (test.txt) do (
  3.   set "str=%%a"
  4.   for /f tokens^=1-2*delims^=^" %%i in ("!str!") do (
  5.     if "%%j"=="222" (
  6.       set substr=%%j
  7.       set replace=888888888
  8.       call set "str=%%str:!substr!=!replace!%%"
  9.     )
  10.     echo !str!
  11.   )
  12. )
  13. pause
复制代码

作者: apang    时间: 2012-7-1 11:24

  1. @echo off
  2. for /f "delims=" %%a in (1111.txt) do (
  3.   set str=%%a
  4.   setlocal enabledelayedexpansion
  5.   set str=!str:"222"="888888"!
  6.   echo,!str!
  7.   endlocal
  8. )
  9. pause
复制代码

作者: hehening88    时间: 2012-7-1 15:28

回复 2# weichenxiehou


    前辈你好,你把我得问题看简单了if(“%%j”==“222”)这个判断不可能有,因为222只是我举得一个列子,你的想法是第一个for循环遍历每一行,通过if判断确定对第二行操作是吧,但这个if判断不能有if里面等号右边是什么不可知还有您最后一句echo !str!是写在文本文件操作的那一行而不是在屏幕上输出吗?
还有我用type “1111.txt"^|find "222"在文本中找到了这一行,我怎么把整个找到的这行返回给一个变量呢
作者: weichenxiehou    时间: 2012-7-1 15:43

本帖最后由 weichenxiehou 于 2012-7-1 15:55 编辑

你的意思是“将所有行中引号之间的内容替换为888888888”吗?
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (test.txt) do (
  3.   set "str=%%a"
  4.   for /f tokens^=1-2*delims^=^" %%i in ("%%a") do (
  5.     if not "%%j"=="" set "str=%%i"888888888"%%k"
  6.   )
  7.   echo,!str!
  8. )>result.txt
  9. pause
复制代码
没有定位到文本只是方便测试而已,在屏幕上看比打开文件核对更快。
最后一个问题:
  1. for /f "delims=" %%i in ('type "1111.txt"^|find "222"') do set "var=%%i"
复制代码

作者: powerbat    时间: 2012-7-1 17:47

  1. @set @n=0//& cscript.exe -e:jscript "%~f0" &pause&exit/b
  2. fso = new ActiveXObject("Scripting.FileSystemObject");
  3. s = fso.OpenTextFile("1.txt").ReadAll();
  4. s = s.replace(/"[^"\r\n]+"/g, '"88888888"');
  5. fso.OpenTextFile("2.txt",2,true).write(s);
复制代码

作者: Hello123World    时间: 2012-8-8 15:59

假设药替换的文本是1.txt。
  1. sed 's/"222"/"88888888"/' 1.txt>new1.txt
复制代码
需要下载sed.exe到c:\windows\system32文件夹中。




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