中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]提取文件中格式类似的字符[有点难坛论没见过的]
« [1] [2] »
作者:
标题: [求助]提取文件中格式类似的字符[有点难坛论没见过的] 上一主题 | 下一主题
baikaifang
初级用户





积分 68
发帖 32
注册 2006-10-20
状态 离线
『第 16 楼』:  



  Quote:
Originally posted by lxmxn at 2007-6-4 16:38:

不要怪别人没有看,你的意思根本没有说清楚,所以大家也懒得看了。

说不清楚举个例子出来,不要说一些有歧义的话。

lxmxn版主你好,是我的不对,你别怪我了好吗,在这里跟你说声"对不起",也要谢谢你的支持

terse 朋友,我用你上面改进 lxmxn版主 的批处理
@echo off
for /f "tokens=1* delims=:" %%i in ('findstr /risc:"PCI\\\VEN_....&" *.inf') do (
echo %%j=%%~fdpi >>123.txt
)
pause

提取出来的内容是下面这样的
%DEVICE_DESCRIPTION_9K% = Install, PCI\VEN_13C1&DEV_1002&SUBSYS_100213C1=C:\M\3\1\O\oemsetup.inf
%DEVICE_DESCRIPTION_9X% = Install, PCI\VEN_13C1&DEV_1003&SUBSYS_100313C1=C:\M\3\1\O\oemsetup.inf
%aec6897.DeviceDesc% = aec689x_Inst, PCI\VEN_1191&DEV_000B&SUBSYS_1191000B=C:\M\A\6\aec6897.inf
%aec6898.DeviceDesc% = aec689x_Inst, PCI\VEN_1191&DEV_000B&SUBSYS_11916898=C:\M\A\6\aec6897.inf
%PCI\VEN_9005&DEV_00C0&SUBSYS_F6209005.DeviceDesc% = adpu160m_Inst,PCI\VEN_9005&DEV_00C0&SUBSYS_F6209005=C:\M\AD\5\ADPU160M.INF
%PCI\VEN_9005&DEV_00C0&SUBSYS_F6200E11.DeviceDesc% = adpu160m_Inst,PCI\VEN_9005&DEV_00C0&SUBSYS_F6200E11=C:\M\AD\5\ADPU160M.INF
能再改进一下,只输出红色部分的内容吗!真的谢谢您

[ Last edited by baikaifang on 2007-6-4 at 10:50 PM ]

2007-6-4 22:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
baikaifang
初级用户





积分 68
发帖 32
注册 2006-10-20
状态 离线
『第 17 楼』:  



  Quote:
Originally posted by lxmxn at 2007-6-3 15:49:


第一个\对第二个\取消转义,得到一个“真实”的\,然后这个\去取消第三个\的特殊意义。(我是这样理解的)

至于不是以PCI\VEN打头,我是看楼主的说明这样写的:

版主,我试了一下,二个"\",和三个"\",在我这里使用,输出的内容是一样的.

2007-6-4 23:04
查看资料  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 18 楼』:  

问题是你不是没每行都是这样的  有的有,有的还是没吧?
要是每行都这样那还可以

2007-6-4 23:12
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
baikaifang
初级用户





积分 68
发帖 32
注册 2006-10-20
状态 离线
『第 19 楼』:  

是呀,提取出来的内容好乱,有很多是不需要的,也输出了,还有很多重复的.看来真难搞呀.

2007-6-4 23:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 20 楼』:  

再改一下版主的:
@echo off&setlocal enabledelayedexpansion
for /f "delims=: tokens=1*" %%i in ('findstr /ris "PCI\\\VEN_....&" *.inf') do (
          set "m=%%j"
       set n=%%~fdpxi
        set "m=!m:*,=!"
echo !m!=!n! >>test.txt
)
pause

2007-6-5 00:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




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

试试这个,需要外部命令grep。
@echo off
for /r C:\M\ %%a in (*.inf) do (
        for /f "tokens=1* delims=:" %%b in ('grep -o "PCI\\VEN_[[:alnum:]]\{4\}&DEV_[[:alnum:]]\{4\}&SUBSYS_[[:alnum:]]\{8\}" "%%a"') do (
        echo\%%b=%%a>>result.txt
        )
)
grep 下载地址:http://zhenlove.com.cn/cndos/fileup/files/grep.rar

2007-6-5 00:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
baikaifang
初级用户





积分 68
发帖 32
注册 2006-10-20
状态 离线
『第 22 楼』:  



  Quote:
Originally posted by terse at 2007-6-5 00:22:
再改一下版主的:
@echo off&setlocal enabledelayedexpansion
for /f "delims=: tokens=1*" %%i in ('findstr /ris "PCI\\\VEN_....&" *.inf') do (
          set &quo ...

比前面的效果好一些了,不过还是有很多不需要的.例如:
PCI\VEN_9004&DEV_7815.DeviceDesc="Adaptec Memory Controller / XOR Engine" =C:\M\AD\8\oemsetup.inf
SupportedSubsystemIDs,%PCI\VEN_1095&DEV_3512.DeviceDesc%,0x00010001, 0x35121095=C:\M\AD\9\ASH1205.inf
%Win98SupportedControllersSubKey%,%PCI\VEN_1095&DEV_3512.DeviceDesc%,0x00010001, 0x35121095=C:\M\AD\9\ASH1205.inf
PCI\VEN_8086&DEV_24DF.DeviceDesc = "Adaptec Embedded Serial ATA HostRAID"=C:\M\AD\A\AARICH.INF

辛苦大侠了.
下面 lxmxn 版主的基本上可以了.有一些重复的.不过可以手工删除就行了.

  Quote:
Originally posted by lxmxn at 2007-6-5 00:39:
试试这个,需要外部命令grep。
[code]
@echo off
for /r C:\M\ %%a in (*.inf) do (
        for /f "tokens=1* delims=:" %%b in ('grep -o "PCI\\VEN_[[:alnum:]]\{4\}&DEV_[[:aln ...

版主真厉害,上面的代码,非常好.非常感谢
提取出来的内容是同样长度的,下面是效果:
PCI\VEN_13C1&DEV_1002&SUBSYS_100213C1=C:\M\3\1\oemsetup1.inf
PCI\VEN_13C1&DEV_1002&SUBSYS_100213C1=C:\M\3\1\O\oemsetup.inf
PCI\VEN_13C1&DEV_1003&SUBSYS_100313C1=C:\M\3\1\O\oemsetup.inf

还有与上面长度不一样的没能提出来:
PCI\VEN_13C1&DEV_1000
PCI\VEN_1103&DEV_0004&REV_03

[ Last edited by baikaifang on 2007-6-5 at 09:17 PM ]

2007-6-5 20:57
查看资料  发短消息 网志   编辑帖子  回复  引用回复
baikaifang
初级用户





积分 68
发帖 32
注册 2006-10-20
状态 离线
『第 23 楼』:  

如果版主,把代码改下,对3种格式的分别处理,就可以把3种格式的全部提出来,最后把输出的文件组合起来也行.
顺便问下,下面这句的具体意思.我好搞懂可以自己修改一下.提取不同格式的内容.
for /f "tokens=1* delims=:" %%b in ('grep -o "PCI\\VEN_[[:alnum:]]\{4\}&DEV_[[:alnum:]]\{4\}&SUBSYS_[[:alnum:]]\{8\}" "%%a"')

谢谢

2007-6-5 21:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




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

Re baikaifang:

你要提取的类似“PCI\VEN_13C1&DEV_1002&SUBSYS_100213C1”这样的字符串有什么特点可以“利用”呢?

如果有一些区别其它字符串的特点,我想事情也会变得容易些的。

至于这个 grep 命令,是查找匹配的字符并且只输出匹配的字符,如果想深入学习它的用法,可以到网上搜索相关的资料来看看。

2007-6-5 21:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: