中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]替换文本中的指定字符并保留空行
作者:
标题: [已结]替换文本中的指定字符并保留空行 上一主题 | 下一主题
pusofalse
银牌会员




积分 1604
发帖 646
注册 2008-4-13
状态 离线
『楼 主』:  [已结]替换文本中的指定字符并保留空行

刚刚做了一下试验,发现set出现问题了

a.txt的内容

  Quote:
1234
1234

dsf
fd
d
a

asd

这是我的代码,就是想替换a.txt中的所有d为m,并且保留空行
setlocal enabledelayedexpansion
for /f "tokens=*" %%a in ('findstr /n .* a.txt') do (
  set str=%%a
  set str=!str:*:=!
  set str=!str:d=m!
  echo.!str!
)
pause
我深知这代码输出的内容应该是:

  Quote:
1234
1234

msf
fm
m
a

asm

但是我的却显示

  Quote:
1234
1234
d=m
msf
fm
m
a
d=m
asm

T.T 哪里出毛病了啊?~ 高人指教! 以前也曾遇到过一回for截取字符串不正确的情况,重装系统之后好了,这回不会还要重装系统吧

原因看2楼和4楼~~

───────────────── 版务记录 ─────────────────
执行:HAT
操作:[2008-11-08]在帖子标题中增加搜索关键字
说明:原标题"[已结]不要犯同样的错误,关于set赋值"不利于论坛搜索
───────────────── 版务记录 ─────────────────


[ Last edited by HAT on 2008-11-9 at 00:10 ]

2008-4-27 19:25
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lpk130
初级用户





积分 80
发帖 30
注册 2007-4-19
状态 离线
『第 2 楼』:  

setlocal enabledelayedexpansion
for /f "tokens=*" %%a in ('findstr /n .* a.txt') do (
  set str=%%a
  set str=!str:*:=!
  set str=!str:d=m!
  echo.!str!
)
pause

红色那句,当str为空的时候出错
@echo off&setlocal enabledelayedexpansion
for /f "tokens=*" %%a in ('findstr /n .* a.txt') do (
  set str=%%a
  set str=!str:*:=!
  if defined str set str=!str:d=m!
  echo.!str!
)
pause


2008-4-27 19:40
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pusofalse
银牌会员




积分 1604
发帖 646
注册 2008-4-13
状态 离线
『第 3 楼』:  



  Quote:
Originally posted by lpk130 at 2008-4-27 07:40 PM:
setlocal enabledelayedexpansion
for /f "tokens=*" %%a in ('findstr /n .* a.txt') do (
  set str=%%a
  set str=!str:*:=!
  set str=!str:d=m!
  echo.!str!
)
pause
...

你的代码可是可以的,这样的话也能解决问题,但今天下午时我用我那个代码还是好好的,空行也保留着。。。不知为何~ 就用你这个吧~ 谢谢!

2008-4-27 19:46
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pusofalse
银牌会员




积分 1604
发帖 646
注册 2008-4-13
状态 离线
『第 4 楼』:  

OK 我明白原因了,
在被替换之前,str的值始终不能为空,空的话就会出现我那种情况了,如果在替换之后再把:及其前的所有字符删除掉的话,就可以了~
setlocal enabledelayedexpansion
for /f "tokens=*" %%a in ('findstr /n .* a.txt') do (
  set str=%%a
  set str=!str:d=m!
  set str=!str:*:=!
  echo.!str!
)
pause
就像这样~~ 感谢lpk130!

2008-4-27 19:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 5 楼』:  建议尽量少使用findstr:


@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in ('type a.txt') do (
    set str=%%i
    set str=!str:d=m!
    echo.!str!
)
pause>nul




批处理之家新域名:www.bathome.net
2008-4-27 21:47
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 6 楼』:  

楼上ZW兄有所不知:

  Quote:
for /f ('more') echo >nul                2806.7
for /f ('type') echo >nul                 3932.1
for /f ('findstr .*')  echo >nul         4007.6
for /f ('find /v ""') echo >nul          2966.5
for /f  ( 文件) echo >nul                9807.5

for 集合里 type 比findstr .*还稍慢呢,最快的当属直接用文件速度是其他的2倍
请看此贴:

http://www.cn-dos.net/forum/viewthread.php?tid=39841&fpage=2



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-27 22:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by pusofalse at 2008-4-27 07:25 PM:
刚刚做了一下试验,发现set出现问题了

a.txt的内容
1234
1234

dsf
fd
d
a

asd

这是我的代码,就是想替换a.txt中的所有d为m,并且保留空行
setlocal  ...

空字符再替换将非空



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-27 22:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复
ZJHJ
高级用户





积分 609
发帖 374
注册 2006-8-2
状态 离线
『第 8 楼』:  

这个我也遇到了.也是求高手解决的,

if not "!var!"==""

2008-4-27 22:25
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: