中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-15 15:04
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]关于FOR命令批量提取指定行的文本! 查看 1,059 回复 13
楼 主 [求助]关于FOR命令批量提取指定行的文本! 发表于 2007-10-30 18:14 ·  中国 安徽 阜阳 联通
初级用户
★★
积分 175
发帖 55
注册 2007-04-30 07:15
UID 87008
性别 男
状态 离线
几千个文件,文件名都是: 数字.xml (数字从900-50000不等,不是连续的)

要求就是把所有 xml 文件的第三行提取出来,存为filename.txt

filename.txt 文件内容格式为:

1.xml文件第三行
2.xml文件第三行
6.xml文件第三行
。。。。
50000.xml第三行

急,搞了半天搞不出来,贴子看了N多,也没试验出来,救高手帮帮忙!

[ Last edited by wjdidi on 2007-10-30 at 07:53 PM ]
2 发表于 2007-10-30 18:48 ·  中国 北京 鹏博士BGP
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
UID 97070
性别 男
状态 离线
将批处理放在那些xml所在目录.

@echo off
echo 处理中...
for /l %%a in (900,1,50000) do (if exist %%a.xml call :f %%a)
echo 结束。
pause>nul
goto :eof
:f
for /f "skip=2 delims=" %%a in (%1.xml) do (echo.%%a>>filename.txt && goto :eof)
3 发表于 2007-10-30 19:35 ·  中国 安徽 阜阳 联通
初级用户
★★
积分 175
发帖 55
注册 2007-04-30 07:15
UID 87008
性别 男
状态 离线
处理中...
结束。

不行啊,没有产生filename.txt啊
4 发表于 2007-10-30 20:07 ·  中国 浙江 衢州 中移铁通
银牌会员
★★★
积分 1,436
发帖 739
注册 2007-10-11 17:44
UID 99469
性别 男
状态 离线
@echo off
for %%a in (*.xml) do (
for /f "tokens=1* delims=:" %%i in ('findstr /n .* %%a') do (
if %%i==3 echo %%j>>filename.txt&&goto :eof
)
)
5 发表于 2007-10-30 20:18 ·  中国 安徽 阜阳 联通
初级用户
★★
积分 175
发帖 55
注册 2007-04-30 07:15
UID 87008
性别 男
状态 离线
Originally posted by abcd at 2007-10-30 08:07 PM:
@echo off
for %%a in (*.xml) do (
for /f "tokens=1* delims=:" %%i in ('findstr /n .* %%a') do (
if %%i==3 echo %%j>>filename.txt&&goto :eof
)
)


还是不行,只能提取第一个文件的第三行,其它的文件都提取不了
6 发表于 2007-10-30 22:02 ·  中国 江苏 常州 武进区 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
UID 42345
状态 离线
我这里测试通过

@echo off
for %%i in (*.xml) do (
set i=%%i
call :doc
)
start filename.txt
goto :eof
:doc
for /f "delims=" %%a in ('more/e +2 ^< "%i%"') do (
if not defined line set "line=%%a"
)
echo,%line%>>filename.txt
set line=


[ Last edited by terse on 2007-10-31 at 12:52 AM ]
7 发表于 2007-10-30 22:22 ·  中国 安徽 阜阳 联通
初级用户
★★
积分 175
发帖 55
注册 2007-04-30 07:15
UID 87008
性别 男
状态 离线
还是不行,哎,郁闷了
8 发表于 2007-10-30 22:43 ·  中国 北京 鹏博士BGP
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
UID 97070
性别 男
状态 离线
Originally posted by wjdidi at 2007-10-30 07:35 PM:
处理中...
结束。

不行啊,没有产生filename.txt啊



文件是生成到你的当前执行目录了.

这样吧,你双击运行批处理,然后会发现在批处理所在目录生成了filename.txt.
9 发表于 2007-10-30 23:12 ·  中国 江苏 常州 溧阳市 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
UID 42345
状态 离线
Originally posted by wjdidi at 2007-10-30 22:22:
还是不行,哎,郁闷了

我这里测试好的 会是什么问题呢?
10 发表于 2007-10-31 00:06 ·  中国 浙江 杭州 电信
高级用户
★★
积分 537
发帖 219
注册 2007-08-04 09:43
UID 94620
性别 男
来自 杭州--半山
状态 离线
for /f "delims=" %%a in ('dir /b /s /a-d *.xml') do sed -n "3p" %%~sa|sed "/^$/d"|more>>filename.txt
pause
11 发表于 2007-10-31 00:25 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
2楼的应该可以啊?

@echo off
for %%a in (*.xml) do call :lis "%%a"
start filename.txt
exit
:lis
for /f "skip=2 delims=" %%i in (%~1) do echo %%i>>filename.txt&&goto :eof
致精致简!
12 发表于 2007-10-31 00:55 ·  中国 安徽 阜阳 联通
初级用户
★★
积分 175
发帖 55
注册 2007-04-30 07:15
UID 87008
性别 男
状态 离线
二楼的代码运行后真没有生成filename.txt

Originally posted by junchen2 at 2007-10-31 12:06 AM:
for /f "delims=" %%a in ('dir /b /s /a-d *.xml') do sed -n "3p" %%~sa|sed "/^$/d"|more>>filename.txt
pause


这段代码可以,问题已解决,谢谢各位高手!!!
13 发表于 2007-10-31 09:38 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线
直接
sed "3!d" *.xml > filename.txt
不行么?
14 发表于 2007-10-31 09:45 ·  中国 浙江 衢州 中移铁通
银牌会员
★★★
积分 1,436
发帖 739
注册 2007-10-11 17:44
UID 99469
性别 男
状态 离线
sed -n "3{p;q}" *.xml>>filename.txt
论坛跳转: