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

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

[复制链接]
发表于 2012-6-30 15:51:08 | 显示全部楼层 |阅读模式
测试文本文件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!把原文本第二行替换掉
发表于 2012-6-30 16:44:17 | 显示全部楼层

  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
复制代码
发表于 2012-7-1 11:24:36 | 显示全部楼层
  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
复制代码
 楼主| 发表于 2012-7-1 15:28:47 | 显示全部楼层
回复 2# weichenxiehou


    前辈你好,你把我得问题看简单了if(“%%j”==“222”)这个判断不可能有,因为222只是我举得一个列子,你的想法是第一个for循环遍历每一行,通过if判断确定对第二行操作是吧,但这个if判断不能有if里面等号右边是什么不可知还有您最后一句echo !str!是写在文本文件操作的那一行而不是在屏幕上输出吗?
还有我用type “1111.txt"^|find "222"在文本中找到了这一行,我怎么把整个找到的这行返回给一个变量呢
发表于 2012-7-1 15:43:05 | 显示全部楼层
本帖最后由 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"
复制代码
发表于 2012-7-1 17:47:41 | 显示全部楼层
  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);
复制代码
发表于 2012-8-8 15:59:29 | 显示全部楼层
假设药替换的文本是1.txt。
  1. sed 's/"222"/"88888888"/' 1.txt>new1.txt
复制代码
需要下载sed.exe到c:\windows\system32文件夹中。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-19 08:44 , Processed in 0.020169 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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