|
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 来自 四川南充
状态 离线
|
|
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: |
- @echo off
- echo --------------------------
- for /f %%i in (a.xml) do echo --"%%i"--
- echo --------------------------
- for /f "tokens=*" %%i in (a.xml) do echo --"%%i"--
- echo --------------------------
- for /f "tokens=* delims=" %%i in (a.xml) do echo --"%%i"--
- echo --------------------------
- for /f "tokens=* delims=/" %%i in (a.xml) do echo --"%%i"--
- echo --------------------------
- pause
hxuan?表ー: 2006-11-24 11:22 |
|
四个FOR中,第一个结果是a.xml文件中的所有空行,空格行及跳格符都不输出,并且每行中只输出了第一个空格和空格,空格和跳格,跳格和跳格之间的字符,也就是说默认以空格及跳格符为分格符,且只输出了分隔后的第一个内容,此时用%%j也不可输出第二个内容.
第二个结果是空行不输出,空格行变成了空行输出,跳格行变成了空行输出,并且每行最前面的空格和跳格也不输出了,这也是为什么空格行和跳格行成了空行.
第三个结果没有输出空行,其它是按原样输出了.
第四个和第三个一样的结果,这果的分隔符可以改成其它的一样,当然除了一些特殊的字符.
所以,空格和跳格主要是分隔符的问题,可以解决.
代码修改如下:
Quote: |
- @echo off
- setlocal enabledelayedexpansion
- set /a a=1
- for %%x in (*.xml) do (
- for /f "tokens=* delims=" %%i in (%%x) do (
- set "var=%%i"
- set "var=!var:300=100!"
- echo.!var!>>!a!.xml.love
- )
- set /a a=!a!+1
- )
hxuan?表ー: 2006-11-24 13:33 |
|
再说一下空行.1楼的
Quote: | 该脚本是要替换某目录下xml文本中的300为100。脚本能够正确修改,但是如果遇到空行(比如只有一个回车符,或者还有其它空格符,跳格符),空行会被替换成“300=100”,很郁闷,请教解决方案!谢谢啦! |
|
好像不是空行会被替换成“300=100”,而是空格行和跳格行才对,空行就没有输出.
执行如下代码:
Quote: |
- @echo off
- setlocal enabledelayedexpansion
- set a=1
- for /f "tokens=* delims=" %%i in (a.xml) do (
- echo --!a!--%%i--
- set /a a+=1
- )
- 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 |
|
|
不得不爱
超级版主
我爱DOS
积分 5310
发帖 2044
注册 2005-9-26 来自 四川南充
状态 离线
|
|
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 |
|
|
hxuan999
中级用户
DOS之日
积分 337
发帖 161
注册 2006-11-4
状态 离线
|
『第
11 楼』:
如何把文本最后一行保存为另一文本?
看到了这个贴,找到了解决方法,先谢过9楼.
Quote: |
- @echo off
- setlocal enabledelayedexpansion
- set /a a=1
- for %%x in (*.xml) do (
- for /f "tokens=1* delims=:" %%i in ('findstr /n .* %%x') do (
- set "var=.%%j"
- set "var=!var:300=100!"
- echo.!var:~1!>>!a!.xml.love
- )
- set /a a=!a!+1
- )
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 |
|