Board logo

标题: [文本处理] 批处理怎样修改文本中的内容? [打印本页]

作者: hello70    时间: 2012-6-9 09:10     标题: 批处理怎样修改文本中的内容?

我在网上查了许多批处理代码,都不能解决问题。
修改a.txt中的多行内容:
#include "H:\形态40\生成数组、统计、显示可删除数\\生成数组的.h"

void 生成数组(int zongqishu,int kkkc,int cj[][20],int dj[][150])

改为:
#include "H:\形态40\生成数组、统计、显示可删除数1\1\生成数组的11.h"

void 生成数组11(int zongqishu,int kkkc,int cj[][20],int dj[][150])

修改后,要不改变其他地方的空行。

请高手指点,谢谢!
作者: canyuexiaolang    时间: 2012-6-9 10:27

你能否说一下修改规则,把a.txt全部内容都贴上来。主要是你这个毫无规律的修改。。。
作者: hello70    时间: 2012-6-9 10:42

a.txt全部内容:
#include "H:\多线程七星彩\形态40\生成数组、统计、显示可删除数\\生成数组的.h"
//#include "排序.h"
void 生成数组(int zongqishu,int kkkc,int cj[][20],int dj[][150])
{
//---------------------------------------------------------------------------------------------------------------------------
int n=30;//要预测的位数,本程序的有效位数是50-->98,确定一个位数,实际上确定了7个位数
//---------------------------------------------------------------------------------------------------------------------------

//dj[i][1]:表示1位数;dj[i][2]:表示2位数;dj[i][3]:表示3位数;dj[i][4]:表示4位数;dj[i][5]:表示5位数;dj[i][6]:表示6位数;dj[i][7]:表示7位数;


//dj[i][8]:表示1+2位;dj[i][9]:表示1+3位;dj[i][10]:表示1+4位;dj[i][11]:表示1+5位;dj[i][12]:表示1+6位;dj[i][13]:表示1+7位;


//dj[i][14]:表示2+3位;dj[i][15]:表示2+4位;dj[i][16]:表示2+5位;dj[i][17]:表示2+6位;dj[i][18]:表示2+7位;


//dj[i][19]:表示3+4位;dj[i][20]:表示3+5位;dj[i][21]:表示3+6位;dj[i][22]:表示3+7位;


//dj[i][23]:表示4+5位;dj[i][24]:表示4+6位;dj[i][25]:表示4+7位;


}
作者: hello70    时间: 2012-6-9 10:46

要求:
1.“void 生成数组"改为”void 生成数组11“
2."生成数组、统计、显示可删除数"改为"生成数组、统计、显示可删除数1"
3."\\"改为"\1\"
4."\\生成数组的.h"改为“\\生成数组的11.h"
作者: forfiles    时间: 2012-6-9 10:57

回复 4# hello70


    条件4是不是应该放在条件3前面啊?
作者: apang    时间: 2012-6-9 11:03

  1. @echo off
  2. (for /f "tokens=1* delims=:" %%a in ('findstr /n ".*" a.txt') do (
  3.   set "str=%%b"
  4.   setlocal enabledelayedexpansion
  5.   if not "!str!"=="" (
  6.     set "str=!str:void 生成数组=void 生成数组11!"
  7.     set "str=!str:生成数组、统计、显示可删除数=生成数组、统计、显示可删除数1!"
  8.     set "str=!str:\\生成数组的.h=\\生成数组的1.h!"
  9.     set "str=!str:\\=\1\!"
  10.   )
  11.   echo,!str!&endlocal
  12. ))>b.txt
复制代码

作者: hello70    时间: 2012-6-9 11:04

是的,而且不要改变文本的空行
作者: canyuexiaolang    时间: 2012-6-9 11:15

回复 7# hello70

  1. @echo off
  2. (for /f "tokens=1* delims=:" %%i in ('findstr /n .* a.txt') do (
  3.     set "line=%%j"
  4.     setlocal enabledelayedexpansion
  5.     if "!line!"=="" (echo.!line!) else (
  6.     set "line=!line:\\=\1\!"
  7.     set "line=!line:显示可删除数=显示可删除数1!"
  8.     set "line=!line:生成数组的.h=生成数组的11.h!"
  9.     set "line=!line:void 生成数组=void 生成数组11!"
  10.     echo.!line!
  11.     endlocal
  12. )))>a_back.txt
  13. move a_back.txt a.txt
  14. pause
复制代码


空行保留了
作者: lunafay    时间: 2012-6-9 11:18

批处理不会
用powershell写了一个
  1. Get-Content D:\a.txt | %{$_.replace("void 生成数组","void 生成数组11")}| %{$_.replace("生成数组、统计、显示可删除数","生成数组、统计、显示可删除数1")}| %{$_.replace('\\','\1\')} | %{$_.replace('\\生成数组的.h','\\生成数组的11.h')}|out-file d:\b.txt
复制代码
不知是否满足你的需求
作者: hello70    时间: 2012-6-9 11:24

谢谢各位老师,你们帮我解决问题了
作者: poter    时间: 2012-6-9 23:08

回复 8# canyuexiaolang


    这个地方不是很理解,输出空行只要echo.就可以了嘛,为嘛还要用echo.!line!呢?
作者: Topgunguy    时间: 2012-6-23 01:41

各位版友大家好,我是新来的。
这帖实在是太精彩了,两星期前路过这里看到这帖,马上注册了ID,
感谢高手们不吝啬地分享代码。

之後小弟根据需要,加了一个回圈,但马上遇到问题,还请高手们指点一下。
我想把数个档案拉到bat档上开启,一次执数个的替换
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. ::批处理似乎最多只收九个参数
  4. for /l %%k in (1,1,9) do (
  5. call echo transform %%%%k
  6. (for /f "tokens=1* delims=:" %%i in ('findstr /n .* %%%%k') do (
  7.     set "line=%%j"
  8.     if "!line!"=="" (echo.!line!) else (
  9.     set "line=!line:/G05.1 Q1=!"
  10.     set "line=!line:(G80=G80)!"
  11.     set "line=!line:.M09=.!"
  12.     set "line=!line:/G05.1 Q0=!"
  13.     echo.!line!
  14.     endlocal
  15. )))>back.txt
  16. move back.txt %%%%k
  17. call echo %%%%k DONE
  18. )
  19. )
  20. pause
复制代码
执行後,没有产生替换,出现了九个奇怪的档案,
请问正确的格式应该要怎麽写呢?感谢~
附上原始档案与希望完成的档案
https://docs.google.com/open?id=0B_4U7laqmGGXVVJHZHpkbktyYWs




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