Board logo

标题: 怎么利用批处理替换文本文件中的指定内容. [打印本页]

作者: pengfei     时间: 2006-7-22 17:54    标题: 怎么利用批处理替换文本文件中的指定内容.

就是把A.TXT中的第一行字符,替换B.TXT中的###字符.
再把A.TXT中的第二行字符,替换B.TXT中的@@@字符.
一共有好几行需要替换
........................
这个能行的通吗,求高手指点.
多谢!

[ Last edited by pengfei on 2006-7-22 at 23:19 ]
作者: willsort     时间: 2006-7-22 19:12

───────────────── 版务记录 ─────────────────
执行:Will Sort
操作:移动主题:自 DOS疑難解答 & 問題討論(解答室)
说明:依照主题内容分类,更适合于发表在此版区
处罚:因属论坛新人,不予积分处罚,请访问 {7326}论坛新手必读,所有人的基本行为准则[转帖]
───────────────── 版务记录 ─────────────────



───────────────── 版主提示 ─────────────────
为了便于论坛用户浏览和版主管理,请您修改本主题的标题,以简要叙述主题的内容或意图
如果您确认标题不需要修改,请继续回复该主题进行申辩,若申辩理由充分,将取消该通知
如果您确认标题需要修改,请点击该主题首帖下方"编辑"按钮,在编辑页面中修改标题栏
如果此通知发出三日后您仍未进行申诉或修改,将由版主进行修改,并对作者进行相应处罚
处罚为扣除8点积分,包括追回您因发表主题奖励的6分和因标题违规而惩罚性扣除的2分
在得知您做出积极恰当的回应后,版主将在三个工作日内删除本提示以消除对您的不利影响
───────────────── 版主提示 ─────────────────

作者: namejm     时间: 2006-7-22 20:51
  参考了5楼doscc的写法,修改了以前的代码,请注意使用条件:
@echo off
:: 如果A.txt第M行中含有在第N行中要替换的内容S(M<N),则会用S来替换B.txt中含有第M行中的匹配内容
:: 例如:假设A.txt中第1行含有在第二行中要替换的@@@,则会用@@@替换B.txt中含有第一行的@@@。
:: 使用格式:要用第M行的内容来替换S,就在第M行的位置上加一句 call :_replace S
:: 如果在第N行上没有要替换的内容,第N行的位置加 set num=N
setlocal enabledelayedexpansion
set num=0
call :_replace ###
call :_replace @@@
set num=3
call :_replace $$$
exit

:_replace
set /a num+=1
set char=%1
for /f "tokens=1,2* delims=:" %%i in ('findstr /n . A.txt') do if %%i equ %num% set str=%%j
for /f "delims=" %%i in (B.txt) do (
    set _str=%%i
    set "_str=!_str:%char%=%str%!"
    echo !_str!>>tmp.txt
)
move tmp.txt B.txt
[ Last edited by namejm on 2006-7-23 at 16:29 ]
作者: pengfei     时间: 2006-7-22 23:13
呵呵~ 我试一下,辛苦了.
作者: doscc     时间: 2006-7-23 04:04
我也来一个
代码以 @ # $ 三个字符为例!
如果处理的文件更复杂. 最好用第三方工具!
@echo off & setlocal enabledelayedexpansion
copy a.txt a-BF.txt >NUL
copy b.txt b-BF.txt >NUL
call :nf @@@
call :nf ###
call :nf $$$
::还有要替换的字符写在这里以 "call :nf 字符" 的型式!注意有特殊意议的字符 如: | & 等...
goto :EOF

:nf
set str=%1
set /P line=<a.txt
more +1 < a.txt >>_a.txt
move /Y _a.txt a.txt

for /f "delims=" %%i in (b.txt) do (
set _str=%%i
set _str=!_str:%str%=%line%!
echo !_str! >>1.txt
)
move /Y 1.txt b.txt
goto :EOF
[ Last edited by doscc on 2006-7-23 at 04:38 ]
作者: namejm     时间: 2006-7-23 08:54
Re doscc:

  你的代码确实高,用到了call :标号 参数 的格式,这点应该向你学习。看了你的代码,有些地方还不是很懂,慢慢揣摩中。呵呵,水平有限就是这样,继续揣摩中:)

  我的代码除了冒号,似乎不再惧怕任何敏感字符,只是如果要用N行内容来替换的话,势必要重复对第一行代码进行操作的代码格式,用call来解决应该是个不错的思路。哪位再来扩充一下吧。
作者: willsort     时间: 2006-7-23 13:12
Re namejm & doscc:

      doscc 兄实现的是逐行替换,namejm 兄实现的是指定行号行替换,相对来言,前者的灵活性好,后者的效率更高。

      对 namejm 兄的冒号问题,将 tokens=1,2改为tokens=1,2* 应该可以解决。不过这并不意味着可以解决所有的特殊字符问题,你最好找一个具有足够规模和复杂度的批处理代码(也可以是你的批处理自身)作为测试文本。

      另外,建议将行号也作为 :_replace 的参数进行控制,以具有更大的扩展性。
作者: pengfei     时间: 2006-7-23 13:37
厉害,试了一下,能行 咱们DOS联盟真是人才济济呀.
可是我刚入门,看得我是一头雾水,求 namejm 和 doscc 兄能解释一下这些命令的具体含义和用法,我在这里先谢谢了.

[ Last edited by pengfei on 2006-7-23 at 13:43 ]
作者: namejm     时间: 2006-7-23 14:11
Re willsort:

  冒号的问题,用tokens=1,2*确实好用,看来for语句还得好生揣摩;将行号也作为_replace的参数来控制的建议是个好思路,只可惜自己对call :标号 参数 的格式还一知半解,还是现学5楼doscc的,版主有好的办法,不妨贴出来让我们学习学习。

  我所说的似乎不惧怕任何敏感字符,是指似乎无论A.txt或B.txt中是否含有什么敏感字符,都能处理,而不是说把@@@、###等要替换的内容换成敏感字符。可能是我描述得不够准确而让你误解了吧,也可能是我测试的文本不够复杂没有代表性。

  我测试的是以下的文本
A.txt
第一行~`!@#$%^&*()-=_+/?>.<,|\
第二行
第三行&
第四行:
第五行
B.txt
::kkkldnldn##########khldn##k a mnaouoane@@@@@@&&&&44$4$$$$$$$$$><!@#$%^&*()\';,.?/`~|||\<<<>>
sldkla'$$ksoiakpa@@@@@##
sdkoanlkalm@224Y%**8####3&&&&@@@@@

作者: willsort     时间: 2006-7-23 14:48
Re namejm:

      指定行号的参数不难设置,将set /a num+=1 改为 set num=%2,然后将行号跟在 call :_replace @@@ 之后即可。要编写健壮的代码,还需要对引入的参数进行防空和类型判断,当然对于只是内部调用的模块代码,这个要求可以适当降低。

      特殊字符的抵抗问题,建议你按照我上面所说的,将你的这段批处理本身保存为A.TXt/B.TXT 进行测试,相信你会有很多发现。
作者: namejm     时间: 2006-7-23 15:07
  写这个代码的时候,反复的测试把我的脑袋都搞大了;拿自己写的代码保存为A.txt/B.txt来测试,妈呀,我都不认识谁是谁了。哎,碰到稍微复杂的问题,自己的脑袋就要短路,看来,当初不学理工科的选择也不是没根据呀。
  哪位老大赶紧出马吧,我顶不住了。hoho。
作者: doscc     时间: 2006-7-23 16:13
RE: namejm
兄改进后的代码. 很不错。向兄学习! 向版主学习!

RE: pengfei
代码不难. 注析较烦. 看置顶的 批处理教学.你很快就会理解的!
作者: pengfei     时间: 2006-7-23 18:40
两位兄台改写的代码完全达到我预想的要求,只是还看不懂
请问,我能不能直接在批处理中输入字符,然后按顺序替换文本中的指定字符串
过两天再来请教
多谢各位了.

[ Last edited by pengfei on 2006-7-23 at 18:41 ]
作者: pengfei     时间: 2006-7-26 11:34
请问,用SET /P直接指定一个变量%all%,在批处理中输入字符,然后用这个变量去替换文本文档中的指定字符,怎么写.
楼上两位大哥写的批处理,小弟还不怎么明白,正在学习中.
作者: namejm     时间: 2006-7-26 19:10

@echo off
setlocal enabledelayedexpansion
set file=
set /p file=  请输入要操作的文件名称(包括扩展名):
set "file=%file:"=%"
for %%i in ("%file%") do set file=%%~fi
echo.
set replaced=
set /p replaced= 请输入即将被替换的内容:
echo.
set all=
set /p all=  请输入替换字符串:
for /f "delims=" %%i in ('type "%file%"') do (
    set str=%%i
    set "str=!str:%replaced%=%all%!"
    echo !str!>>"%file%"_tmp.txt
)
copy "%file%" "%file%"_bak.txt >nul 2>nul
move "%file%"_tmp.txt "%file%"
start "" "%file%"

作者: pengfei     时间: 2006-7-26 21:12    标题: 多谢

感谢大家对我问题的关心和帮助.
再次谢谢!!!
好人一生平安.

[ Last edited by pengfei on 2006-7-26 at 21:38 ]
作者: jzl168     时间: 2006-8-17 16:11
做个记号,回家好好学习
作者: hxg123     时间: 2006-8-31 23:40    标题: 为什么For 这么复杂?

我智商也算中等,可For看的我糊里糊涂。
形式简洁,理解费尽,是设计者智商太高,想不出简单的表达方式?还是我刻苦不够?

我要效率,哪有前辈学习心得,请告知。
作者: lcmjsjp     时间: 2006-10-28 09:00
太强了!
作者: maotao     时间: 2006-11-1 09:22


  Quote:
Originally posted by namejm at 2006-7-26 19:10:
[code]
@echo off
setlocal enabledelayedexpansion
set file=
set /p file=  请输入要操作的文件名称(包括扩展名):
set "file=%file:"=%"
for %%i in ("%file%&quo ...

呵呵,偶老偷师一下。

不过还得问一下 Namejm 大侠,如果源文本中有不少的空行,我不想在替换后的文本中少了这些个空行。即原来文本中只替换我们需要替换的部分内容,或者说是一行内容,但是其他的诸如空行等,我需要保留,怎么办呢?先谢谢了!
作者: namejm     时间: 2006-11-1 22:57    标题: 保留空行替换字符串

  应 maotao 的请求,在15F的基础上做了个保留空行替换字符串的批处理,顺便修改了一些疏忽之处,但是丧失了对unicode格式文件进行处理的性能:
@echo off
set file=
set /p file=  请把要处理的文件拉到本窗口:
set "file=%file:"=%"
for %%i in ("%file%") do set file=%%~fi
echo.
set replaced=
set /p replaced= 请输入即将被替换的内容:
echo.
set all=
set /p all=  请输入替换字符串:
cd.>"%file%_tmp.txt"
setlocal enabledelayedexpansion
for /f "tokens=1* delims=:" %%i in ('findstr /n .* "%file%"') do (
    set str=%%j
    if not "!str!"=="" set "str=!str:%replaced%=%all%!"
    >>"%file%_tmp.txt" echo.!str!
)
copy "%file%" "%file%_bak.txt" >nul 2>nul
move "%file%_tmp.txt" "%file%"
start "" "%file%"

作者: qq82015930     时间: 2006-11-1 23:21
学习  学习,受益非浅啊
作者: ygwhm     时间: 2008-1-4 21:18
这篇文章对xml的文档有没有效果
作者: 40961434     时间: 2008-5-10 20:20    标题: 求救呀!

我是一个小菜不会VBS
请各位大哥能不能帮我编一个批处理!
我的电脑上的HTML和HTM文件全被写了:
<html><script language="JavaScript">window.open("readme.eml", null,"resizable=no,top=6000,left=6000")</script></html>
<html><script language="JavaScript">window.open("readme.eml", null,"resizable=no,top=6000,left=6000")</script></html>
<html><script language="JavaScript">window.open("readme.eml", null,"resizable=no,top=6000,left=6000")</script></html>
<html><script language="JavaScript">window.open("readme.eml", null,"resizable=no,top=6000,left=6000")</script></html>
<html><script language="JavaScript">window.open("readme.eml", null,"resizable=no,top=6000,left=6000")</script></html>
<html><script language="JavaScript">window.open("readme.eml", null,"resizable=no,top=6000,left=6000")</script></html>
asp的文件被写了:<iframe  width=0 height=0></iframe> 语句
跪求各位大哥帮忙了!