Board logo

标题: 批量修改文件中的空行问题 [打印本页]

作者: btandd     时间: 2006-11-23 07:38    标题: 批量修改文件中的空行问题

我想用一段代码实现批量修改*.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”,很郁闷,请教解决方案!谢谢啦!
作者: redtek     时间: 2006-11-23 08:47
btandd兄最好将你出问题的.XML文件内容传或是贴上来让大家看看,才好正确无误的帮你测试~:)
作者: lxmxn     时间: 2006-11-23 14:28

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

作者: 不得不爱     时间: 2006-11-23 22:17
@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)
作者: btandd     时间: 2006-11-23 22:59


  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! ...

不得不爱是个好同志!正解。能否解释一下为什么会出现这种情况?另外,我发现替换完的文件中,每一行前面的空格都被删除掉了,能否避免这种情况?
作者: btandd     时间: 2006-11-23 23:08
还有一个问题,就是如果替换的是需要转义的字符,比如<,>这类字符,好像就没法正常工作了,怎么转义呢?
作者: hxuan999     时间: 2006-11-25 03:15
首先说一下空行和空格问题,如下代码:

  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 ]
作者: 不得不爱     时间: 2006-11-25 03:33
4楼的代码不是错误的,那是去处了纯空格行的代码
作者: tao0610     时间: 2006-11-25 03:40
加上findstr /v /n . a.xml 对空行的判断就可以了!
作者: hxuan999     时间: 2006-11-25 04:24


  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 ]
作者: hxuan999     时间: 2006-11-25 06:36
如何把文本最后一行保存为另一文本?
看到了这个贴,找到了解决方法,先谢过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 ]