标题: [求助]求一个批处理命令:替换文本文件中的指定字符
[打印本页]
作者: xugq
时间: 2008-9-20 17:23
标题: [求助]求一个批处理命令:替换文本文件中的指定字符
我是搞电子的.对电脑也懂得一点,现在有个问题想请高手们帮个忙.
例如有一个文本文件内容如下:
=c:\aer
=d:\aer
=e:\aer
..........
想吧其中的=c替换成=d
但是其中的=c中的c是不固定内容,有可能是e也有可能是f
我在论坛上研究了好半天了.也没搞明白.
希望高手们能帮个忙.谢谢了.
───────────────── 版务记录 ─────────────────
执行:HAT
操作:在帖子标题中增加搜索关键字
说明:原标题"[求助]求一个批处理命令!"不利于论坛搜索
处罚:因属论坛新人,不予积分处罚
提示:请访问 {7326}论坛新手必读,所有人的基本行为准则[转帖]
───────────────── 版务记录 ─────────────────
[
Last edited by HAT on 2008-9-24 at 09:04 PM ]
作者: HAT
时间: 2008-9-20 17:34
@echo off
>b.txt type nul
for /f "delims=" %%a in (a.txt) do (
setlocal enabledelayedexpansion
set row=%%a
set row=!row:*:==d:!
>>b.txt echo.!row!
endlocal
)
move /y b.txt a.txt
作者: xugq
时间: 2008-9-20 19:55
非常感谢.一会我试试.这里的气氛真是好啊.我还有好多的问题想问啊.不过我想自己先好好的研究下关于批处理的问题.有不明白的地方我还要请教大家.谢谢了.
作者: xugq
时间: 2008-9-21 15:35
我还有个问题想请大家给帮个忙.就是2楼朋友给的这个脚本的问题.
其实是我没有说清楚.我的文本是这样的.
asdfsd=c:\qer
ddkklsss=c:\qer
........................
其中c:\qer中的C 是不固定文本,有可能是d也有可能是e
想把他给换成e,请问应该怎么写这个批处理命令啊?
2楼朋友给的命令用了有就连=前边的字符也没有了..
希望热心的朋友给帮个忙.
作者: HAT
时间: 2008-9-21 16:14
标题: Re 4楼
@echo off
>b.txt type nul
for /f "tokens=1-3 delims=:=" %%a in (a.txt) do (
>>b.txt echo.%%a=e:%%c
)
move /y b.txt a.txt
作者: xugq
时间: 2008-9-21 16:21
收到了.非常感谢HAT 朋友..谢谢了.
作者: xugq
时间: 2008-9-21 16:53
朋友.还是非常的感谢你.不过还是有个问题啊.还要再麻烦下.我都不好意思了.
就是原来的文本是这样的.
asdfsd=c:\qer\aadff
ddkklsss=c:\qer\ddee
asdsd=a:\qer\aadff
dklsss=g:\qer\ddee
............................
现在用这个批处理变成这样了
asdfsd=c:
ddkklsss=c:
asdsd=a:
dklsss=g:
............................
希望变成这样子的.
asdfsd=e:\qer\aadff
ddkklsss=e:\qer\ddee
asdsd=e:\qer\aadff
dklsss=e:\qer\ddee
............................
不知道是不是能实现啊.
真是不好意思..有什么电子方面的东西希望我能帮上忙.
作者: HAT
时间: 2008-9-21 17:02
标题: Re 7楼
你在修改5楼代码的时候是不是改错了?
我这里运行可以得到正确的结果:
Quote: |
C:\Test>type test.bat
@echo off
>b.txt type nul
for /f "tokens=1-3 delims=:=" %%a in (a.txt) do (
echo.%%a=e:%%c
)
move /y b.txt a.txt
C:\Test>type a.txt
asdfsd=e:\qer\aadff
ddkklsss=e:\qer\ddee
asdsd=e:\qer\aadff
dklsss=e:\qer\ddee
C:\Test>test.bat
asdfsd=e:\qer\aadff
ddkklsss=e:\qer\ddee
asdsd=e:\qer\aadff
dklsss=e:\qer\ddee |
|
作者: xugq
时间: 2008-9-21 17:13
哦.对不起是我错了.
不过文本中有些原来是这样的文本也给改了.
原来
LogFam1=ANA,U
LogFam2=BGA,U
LogFam3=BPF,U
LogFam4=BQF,U
LogFam5=CAP,C
LogFam6=CFP,U
LogFam7=CLC,U
LogFam8=CMO,U
LogFam9=CON,J
LogFam10=CQF,U
改成
LogFam1=e:
LogFam2=e:
LogFam3=e:
LogFam4=e:
LogFam5=e:
LogFam6=e:
LogFam7=e:
LogFam8=e:
LogFam9=e:
LogFam10=e:
希望这些能不能不改啊?还望您帮忙.
真是不好意思.
作者: HAT
时间: 2008-9-21 17:24
标题: Re 9楼
@echo off
>b.txt type nul
for /f "tokens=1-2 delims==" %%a in (a.txt) do (
setlocal enabledelayedexpansion
set str=%%b
if "!str:~1,1!" neq ":" (
>>b.txt echo %%a=%%b
) else (
>>b.txt echo %%a=e!str:~1!
)
endlocal
)
move /y b.txt a.txt
作者: xugq
时间: 2008-9-21 17:31
收到了.这次很成功.谢谢了.
不过不好意思的是...
还是有个问题.有些地方多出来了个=号不知为什么
例如
原文本
[directories]
SystemDir=c:\pads2005\2005PADS\SDD_HOME\Programs
FileDir=c:\pads2005\PADS Projects
UserDir=c:\pads2005\Settings
LibDir=c:\pads2005\Libraries
ReuseDir=c:\pads2005\PADS Projects\Reuse
CAMDir=c:\pads2005\PADS Projects\Cam
现在是
[directories]=
SystemDir=e:\pads2005\2005PADS\SDD_HOME\Programs
FileDir=e:\pads2005\PADS Projects
UserDir=e:\pads2005\Settings
LibDir=e:\pads2005\Libraries
ReuseDir=e:\pads2005\PADS Projects\Reuse
CAMDir=e:\pads2005\PADS Projects\Cam
在[directories]=后边多了一个=号.不知为什么..
作者: HAT
时间: 2008-9-21 21:14
标题: Re 11楼
@echo off
>b.txt type nul
for /f "tokens=1-2 delims==" %%a in (a.txt) do (
if "%%b" equ "" (
>>b.txt echo %%a
) else (
set str=%%b
setlocal enabledelayedexpansion
if "!str:~1,1!" neq ":" (
>>b.txt echo %%a=%%b
) else (
>>b.txt echo %%a=e!str:~1!
)
endlocal
)
)
move /y b.txt a.txt
友情提示:下次提问,记得在顶楼一次性就把自己的文本内容完整的贴出来:)
作者: xugq
时间: 2008-9-21 21:28
恩.是啊.我第一次问问提.原来都是想知道什么就去网上查查.呵呵.这次我实在是没办法了.用了好多的文本替换工具都不理想.还用到了change这个工具.上网这么长时间以来还是第一次遇到你这么热心的人.刚刚试验了下.效果非常的理想.我以后也一定要好好学习下dos的批处理命令.谢谢你了.
作者: HAT
时间: 2008-9-21 22:37
标题: Re 16楼
用change.exe也挺好的,一行代码搞定,呵呵。
作者: ceii
时间: 2008-9-22 16:51
对于这种替换,我觉得最好是使用支持正则表达式的工具,如 sed 。
sed "s/=[a-z]:/=e:/" a.txt
楼主每一层提出的问题都可以用这一行代码解决。
作者: cad55
时间: 2008-9-22 17:23
不得不对HAT兄台的助人为乐的精神,顶一下。。。。。。。。。。。
作者: xugq
时间: 2008-9-23 16:55
15楼的朋友.我实验了用SED 了.可在我这里怎么运行都不灵啊...郁闷ING ...
是不是不支持XP 啊.
作者: HAT
时间: 2008-9-23 17:04
标题: Re 17楼
你的sed版本是什么?
Quote: |
C:\Test>sed "s/=[a-z]:/=e:/" a.txt
[directories]
SystemDir=e:\pads2005\2005PADS\SDD_HOME\Programs
FileDir=e:\pads2005\PADS Projects
UserDir=e:\pads2005\Settings
LibDir=e:\pads2005\Libraries
ReuseDir=e:\pads2005\PADS Projects\Reuse
CAMDir=e:\pads2005\PADS Projects\Cam
LogFam1=ANA,U
LogFam2=BGA,U
LogFam3=BPF,U
LogFam4=BQF,U
LogFam5=CAP,C
LogFam6=CFP,U
LogFam7=CLC,U
LogFam8=CMO,U
LogFam9=CON,J
LogFam10=CQF,U
C:\Test>sed --version
GNU sed version 3.02
Copyright (C) 1998 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law. |
|
作者: ceii
时间: 2008-9-23 18:22
我从98试到xp全部都灵。
你应该把出错的信息讲出来啊。
作者: xugq
时间: 2008-9-23 19:54
我的意思是找18楼说的方法我都试过了.可是运行完成后a.txt还是原来的样子.没什么变化.
但是在CMD 里的结果确实是变了.不知道为什么.我也正郁闷呢.
作者: HAT
时间: 2008-9-23 20:00
标题: Re 20楼
@echo off
sed "s/=[a-z]:/=e:/" a.txt>b.txt
move /y b.txt a.txt
sed/gawk之类的文本工具默认只在内存中对文本进行修改
作者: xugq
时间: 2008-9-23 20:09
哦!!这样啊.可是我更晕了.我得到的结果是这样的:
还表示不出来.回车符号都连在一起了.行和行都分不开了.都连在一起了.中间有个黑方块,要是复制粘贴的话就正常了.不知道这是为什么.
作者: ceii
时间: 2008-9-23 20:57
这是回车换行符问题。
如果想直接修改原文件,可加上 -i 参数。
sed -i "s/=[a-z]:/=e:/;s/$/\r/" a.txt
这样应该可以了吧。
作者: HAT
时间: 2008-9-23 21:01
低版本的sed可能不支持-i
这个可以
Quote: |
C:\ProgramMy\GnuWin32>sed --version
GNU sed version 4.1.5
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law. |
|
作者: xugq
时间: 2008-9-23 22:48
加上-i参数确实是好了.但是他生成一个sedDOSSUY的文件.里边才是我想要的内容.
另外 我的sed的版本是4.0.7的.
还有就是你们是怎么把 DOS 下的东西给截下来发到这里的啊?
比如 :
GNU sed version 4.1.5
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.
这段是怎么解出来的?
作者: HAT
时间: 2008-9-23 23:00
Q: 怎样把CMD窗口里的结果拷贝出来?
A: 右键单击CMD窗口的标题栏->"属性"->"选项"->勾选"快速编辑模式"->然后在CMD窗口用鼠标左键选中想要拷贝的内容->在选中的内容上单击鼠标右键->粘贴到文本文件中即可
作者: xugq
时间: 2008-9-23 23:11
哎呀..又学习了一手.哈.感谢HAT兄弟.你可是个热心的好人啊.这么晚还没睡觉啊.呵呵.会了.哈.我的版本是:
G:\pads2005\change\sed>sed --version
GNU sed version 4.0.7
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.
G:\pads2005\change\sed>pause
请按任意键继续. . .
作者: ceii
时间: 2008-9-23 23:15
本论坛提供下载的sed,经测试,确实生成一个sedDOSSU*文件。
我使用的版本也是4.0.7,但没有这个问题。
作者: xugq
时间: 2008-9-23 23:26
28楼的兄弟也没休息啊.哈.原来SED 和SED 还不一样啊.我要再好好研究下.哈.
朋友们晚安.明天继续研究.
实在是不行了.刚才趴桌子上差点睡着了.呵呵.