中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 批量修改文件中的空行问题 上一主题 | 下一主题
btandd
新手上路





积分 14
发帖 5
注册 2006-11-23
状态 离线
『楼 主』:  批量修改文件中的空行问题

我想用一段代码实现批量修改*.xml文件中某部分内容,脚本如下
@echo off
setlocal enabledelayedexpansion
set /a a=1
for %%x in (*.xml) do (
        for /f "tokens=*" %%i in (%%x) do (
            set var=%%i
            set "var=!var:300=100!"   
            echo !var!>>!a!.xml.love
        )
        set /a a=!a!+1       
)
该脚本是要替换某目录下xml文本中的300为100。脚本能够正确修改,但是如果遇到空行(比如只有一个回车符,或者还有其它空格符,跳格符),空行会被替换成“300=100”,很郁闷,请教解决方案!谢谢啦!

2006-11-23 07:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 2 楼』:  

btandd兄最好将你出问题的.XML文件内容传或是贴上来让大家看看,才好正确无误的帮你测试~:)



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-11-23 08:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 3 楼』:  


  可以先判断.xml文件的某一行里面时候存在"300",如果有就处理它,如果没有就跳过去。


2006-11-23 14:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 4 楼』:  

@echo off
setlocal enabledelayedexpansion
set /a a=1
for %%x in (*.xml) do (
for /f "tokens=*" %%i in (%%x) do (set "var=%%i"
if not !var!.==. (set "var=!var:300=100!"
echo !var!!>>!a!.xml.love))
set /a a=!a!+1)

   此帖被 +1 点积分    点击查看详情   
评分人:【 btandd 分数: +1  时间:2006-11-23 23:26




我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-11-23 22:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
btandd
新手上路





积分 14
发帖 5
注册 2006-11-23
状态 离线
『第 5 楼』:  



  Quote:
Originally posted by 不得不爱 at 2006-11-23 09:17 AM:
@echo off
setlocal enabledelayedexpansion
set /a a=1
for %%x in (*.xml) do (
for /f "tokens=*" %%i in (%%x) do (set "var=%%i"
if not !var!.==. (set "var=!var:300=100! ...

不得不爱是个好同志!正解。能否解释一下为什么会出现这种情况?另外,我发现替换完的文件中,每一行前面的空格都被删除掉了,能否避免这种情况?

2006-11-23 22:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
btandd
新手上路





积分 14
发帖 5
注册 2006-11-23
状态 离线
『第 6 楼』:  

还有一个问题,就是如果替换的是需要转义的字符,比如<,>这类字符,好像就没法正常工作了,怎么转义呢?

2006-11-23 23:08
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
hxuan999
中级用户

DOS之日


积分 337
发帖 161
注册 2006-11-4
状态 离线
『第 7 楼』:  

首先说一下空行和空格问题,如下代码:

  Quote:

  1. @echo off
  2. echo --------------------------
  3. for /f  %%i in (a.xml) do echo --"%%i"--
  4. echo --------------------------
  5. for /f "tokens=*" %%i in (a.xml) do echo --"%%i"--
  6. echo --------------------------
  7. for /f "tokens=* delims=" %%i in (a.xml) do echo --"%%i"--
  8. echo --------------------------
  9. for /f "tokens=* delims=/" %%i in (a.xml) do echo --"%%i"--
  10. echo --------------------------
  11. pause
        hxuan?表ー:  2006-11-24  11:22

  四个FOR中,第一个结果是a.xml文件中的所有空行,空格行及跳格符都不输出,并且每行中只输出了第一个空格和空格,空格和跳格,跳格和跳格之间的字符,也就是说默认以空格及跳格符为分格符,且只输出了分隔后的第一个内容,此时用%%j也不可输出第二个内容.
  第二个结果是空行不输出,空格行变成了空行输出,跳格行变成了空行输出,并且每行最前面的空格和跳格也不输出了,这也是为什么空格行和跳格行成了空行.
  第三个结果没有输出空行,其它是按原样输出了.
  第四个和第三个一样的结果,这果的分隔符可以改成其它的一样,当然除了一些特殊的字符.
所以,空格和跳格主要是分隔符的问题,可以解决.
代码修改如下:

  Quote:

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a a=1
  4. for %%x in (*.xml) do (
  5.         for /f "tokens=* delims=" %%i in (%%x) do (
  6.             set "var=%%i"
  7.             set "var=!var:300=100!"   
  8.             echo.!var!>>!a!.xml.love
  9.         )
  10.         set /a a=!a!+1        
  11. )
        hxuan?表ー:  2006-11-24  13:33

再说一下空行.1楼的

  Quote:
该脚本是要替换某目录下xml文本中的300为100。脚本能够正确修改,但是如果遇到空行(比如只有一个回车符,或者还有其它空格符,跳格符),空行会被替换成“300=100”,很郁闷,请教解决方案!谢谢啦!

   好像不是空行会被替换成“300=100”,而是空格行和跳格行才对,空行就没有输出.
   执行如下代码:

  Quote:

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set a=1
  4. for /f "tokens=* delims=" %%i in (a.xml) do (
  5.   echo --!a!--%%i--
  6.   set /a a+=1
  7. )
  8. pause
        hxuan?表ー:  2006-11-24  14:10

结果是,FOR的选项怎么样设置,空行都不会输出.其实空行就没有被读取,直接跳过了.所以4楼的代码也是错误的,空行还是没有输出的.

   我也是新手,说的不对的请高手指点一下,另外哪位高手可以解决一下空行的问题,我也想请教一下.

[ Last edited by hxuan999 on 2006-11-24 at 03:21 PM ]



for /f %%h in (`echo hxuan`) do for /f %%x in (`echo hxuan`) do if %%h==%%x nul
2006-11-25 03:15
查看资料  发送邮件  发短消息 网志  OICQ (33899867)  编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 8 楼』:  

4楼的代码不是错误的,那是去处了纯空格行的代码



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-11-25 03:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tao0610
高级用户

朦胧的世界


积分 579
发帖 218
注册 2006-10-24
状态 离线
『第 9 楼』:  

加上findstr /v /n . a.xml 对空行的判断就可以了!




认识自己,降伏自己,改变自己
,才能改变别人!
2006-11-25 03:40
查看资料  发短消息 网志   编辑帖子  回复  引用回复
hxuan999
中级用户

DOS之日


积分 337
发帖 161
注册 2006-11-4
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by 不得不爱 at 2006-11-24 15:33:
4楼的代码不是错误的,那是去处了纯空格行的代码

没错,本身是没错,只是去了空格行.可是解决不了本贴的问题呀.



楼上的,

  Quote:
加上findstr /v /n . a.xml 对空行的判断就可以了!

我不熟悉FINDSTR,可否写出你的代码来,谢谢了.

[ Last edited by hxuan999 on 2006-11-24 at 04:27 PM ]



for /f %%h in (`echo hxuan`) do for /f %%x in (`echo hxuan`) do if %%h==%%x nul
2006-11-25 04:24
查看资料  发送邮件  发短消息 网志  OICQ (33899867)  编辑帖子  回复  引用回复
hxuan999
中级用户

DOS之日


积分 337
发帖 161
注册 2006-11-4
状态 离线
『第 11 楼』:  

如何把文本最后一行保存为另一文本?
看到了这个贴,找到了解决方法,先谢过9楼.

  Quote:

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a a=1
  4. for %%x in (*.xml) do (
  5.         for /f "tokens=1* delims=:" %%i in ('findstr /n .* %%x') do (
  6.             set "var=.%%j"
  7.             set "var=!var:300=100!"   
  8.             echo.!var:~1!>>!a!.xml.love
  9.         )
  10.         set /a a=!a!+1        
  11. )
        hxuan?表ー:  2006-11-24  17:36

这样空行的问题也就解决了.

[ Last edited by hxuan999 on 2006-11-24 at 06:38 PM ]



for /f %%h in (`echo hxuan`) do for /f %%x in (`echo hxuan`) do if %%h==%%x nul
2006-11-25 06:36
查看资料  发送邮件  发短消息 网志  OICQ (33899867)  编辑帖子  回复  引用回复

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


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



论坛跳转: