中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]文本中按行提取特定字符开头的字符串的问题。
« [1] [2] »
作者:
标题: [已结]文本中按行提取特定字符开头的字符串的问题。 上一主题 | 下一主题
nanhezzb
初级用户





积分 37
发帖 32
注册 2008-8-21
状态 离线
『楼 主』:  [已结]文本中按行提取特定字符开头的字符串的问题。

test.txt内容如下:
O41 - mfetdik - Anti-Virus Mini-Firewall Driver - [color=Red]c:\WINDOWS\system32\drivers\mfetdik.sys[/color] - (running) - Anti-Virus Mini-Firewall Driver - McAfee, Inc. - 64a3b2b683316b31b30c4622008810af
O41 - 1394hub - Generic - Host - Process for Win32 Services - [color=Red]C:\WINDOWS\system32\svchostdy.SYS [/color]- (running) - Generic Host Process for Win32 Services - Microsoft Corporation - a22d7b3594c381efb3395a072725fe95
O40 - svchost.exe - Microsoft Corporation - [color=Red]C:\WINDOWS\WinSxS\x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.2600.3352_x-ww_81af8e88\gdiplus.dll [/color]- Microsoft GDI+ - e08307c7e813517470d1f9d705a7d5b2
测试文本大致为此种格式:
1每行有N段字符串,都使用“ - ”来分隔
2.路径的信息可能是其他后缀名的文件,文件路径可能含有“-”。
3.用“-”作为分隔符,含有路径的字符串是不确定在第几段的位置。
4.路径的有盘符为不确定是C,有可能是D\E\F…….

      我想通过批处理,逐行分析提取从盘符开始直到扩展名结束的字符串(测试文本的红色部分),也就是不管什么方法提取每行中的文件的路径信息,因为其他段都是一些文件的属性参数和路径无关

小弟的水平,是在是想不出来一个完美点的批处理。

———————————————————————
感谢2楼的朋友,再次更新了问题!谢谢大家的回复和帮助!!
———————————————————————


[ Last edited by HAT on 2008-12-15 at 18:12 ]

2008-12-14 16:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 2 楼』:  


@echo off & setlocal EnableDelayedExpansion
for /f %%a in (test.txt) do (
  set str=%%a
  for /f "delims=-" %%i in ("!str:*-xx=!") do echo xx%%i
)
pause


   此帖被 +1 点积分    点击查看详情   
评分人:【 nanhezzb 分数: +1  时间:2008-12-15 09:30


2008-12-14 17:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 3 楼』:  re 4 楼


@echo off & setlocal EnableDelayedExpansion
for /f "delims=" %%a in (test.txt) do (
  set str=%%a
  for /f "delims=- " %%i in ("!str:*C:=!") do echo C:%%i
)
pause


   此帖被 +1 点积分    点击查看详情   
评分人:【 nanhezzb 分数: +1  时间:2008-12-15 09:29


2008-12-14 18:12
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 4 楼』:  

撇开批处理不谈,你是如何用人工提取路径信息的呢?你把规律总结出来,自然有人告诉你如何写代码。



2008-12-15 10:54
查看资料  发短消息 网志   编辑帖子  回复  引用回复
nanhezzb
初级用户





积分 37
发帖 32
注册 2008-8-21
状态 离线
『第 5 楼』:  



  Quote:
Originally posted by HAT at 2008-12-15 10:54 AM:
撇开批处理不谈,你是如何用人工提取路径信息的呢?你把规律总结出来,自然有人告诉你如何写代码。

人工的话,每行中从盘符(C、D或者其他)开始直到文件扩展名(.sys、.dll)结束。也就是文件的全路径,比如C:\WINDOWS\system32\drivers\XXXX.sys或者C:\WINDOWS\system32\XXXX.dll
      想通过批处理,逐行分析提取从盘符开始直到扩展名结束的字符串(测试文本的红色部分),也就是不管什么方法提取每行中的文件的路径信息,因为其他段都是一些文件的属性参数和路径无关。

[ Last edited by nanhezzb on 2008-12-15 at 12:12 ]

2008-12-15 12:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
nafan
初级用户





积分 22
发帖 21
注册 2008-11-13
状态 离线
『第 6 楼』:  

没有来得及细想,是否可以按照这个思路呢:
先按照" - "分隔符号把文本分成一个一个字段
然后提取包含:\的字段。

2008-12-15 13:21
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
nafan
初级用户





积分 22
发帖 21
注册 2008-11-13
状态 离线
『第 7 楼』:  

建议用awk 或者grep

2008-12-15 13:25
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 8 楼』:  

空格-空格替换为某字符……

然后分割……

文件路径带" - "的话会出问题,不过个人认为大部分都不会除了歌曲那些东西



S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
2008-12-15 13:32
查看资料  发短消息 网志   编辑帖子  回复  引用回复
a794685135
初级用户





积分 71
发帖 34
注册 2007-12-20
状态 离线
『第 9 楼』:  

按照8楼的思路写了个
@echo off&setlocal enabledelayedexpansion
for /f "tokens=*" %%j in (test.txt) do (
    set a=%%j
    set a=!a: - =(!
    call :loop
)
pause


:loop
for /f "tokens=1 delims=(" %%i in ("!a!") do (
    set b=!a:~1,2!
    if /i "!b!"==":\" echo %%i
)
set a=!a:*(=!
if !a!==!c! goto :eof
set c=!a!
goto :loop


   此帖被 +1 点积分    点击查看详情   
评分人:【 nanhezzb 分数: +1  时间:2008-12-15 14:30


2008-12-15 13:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 10 楼』:  

。。。少说了点……

先:分割……

前半部分set取最后一个字符得到Driver

后部分再按8楼走……
后面也可以一个个取。。。自己匹配吧



S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
2008-12-15 14:00
查看资料  发短消息 网志   编辑帖子  回复  引用回复
nanhezzb
初级用户





积分 37
发帖 32
注册 2008-8-21
状态 离线
『第 11 楼』:  



  Quote:
Originally posted by a794685135 at 2008-12-15 01:43 PM:
按照8楼的思路写了个
[code]
@echo off&setlocal enabledelayedexpansion
for /f "tokens=*" %%j in (test.txt) do (
    set a=%%j
    set a=!a: - =(!
    call :loop
)
pause


:loop
for /f "tokens=1 delims=(" %%i in ("!a!") do (
    set b=!a:~1,2!
    if /i "!b!"==":\" echo %%i
)
set a=!a:*(=!
if !a!==!c! goto :eof
set c=!a!
goto :loop

我试试了,好像是可以输出正确的结果的,谢谢了。不过我对里面的set a=!a: - =(!的参数不理解,等于左括号 在里面什么意思?
能详细的讲下含有a\b表达式的意思吗?

[ Last edited by nanhezzb on 2008-12-15 at 15:41 ]

2008-12-15 14:32
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 12 楼』:  


@echo off & setlocal EnableDelayedExpansion
for /f "delims=" %%a in (test.txt) do (
  set str=%%a
  for /f "delims=" %%i in ("!str:*:=!") do set L=!str:%%i=!
  for /f "delims=- " %%i in ("!str:*:=!") do echo !L:~-2!%%i
)
pause


   此帖被 +1 点积分    点击查看详情   
评分人:【 nanhezzb 分数: +1  时间:2008-12-15 15:15


2008-12-15 14:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复
nanhezzb
初级用户





积分 37
发帖 32
注册 2008-8-21
状态 离线
『第 13 楼』:  



  Quote:
Originally posted by tireless at 2008-12-15 02:44 PM:
@echo off & setlocal EnableDelayedExpansion
for /f "delims=" %%a in (test.txt) do (
  set str=%%a
  for /f "delims=" %%i in ("!str:*:=!") do set L=!str:%%i=!
  for /f "delims=- " %%i in ("!str:*:=!") do echo !L:~-2!%%i
)
pause

这种先取:后面的段,然后添加前面的盘符。相比之下,对路径里面或者是其他段的空格或者是-的准确度比较高呢?

高手能不能讲下set的参数以及表达式意思

[ Last edited by nanhezzb on 2008-12-15 at 15:41 ]

2008-12-15 14:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 14 楼』:  Re 13楼

先看帮助,后提问。
set /?
环境变量替换已如下增强:

    %PATH:str1=str2%

会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的
开始到 str1 剩余部分第一次出现的地方,都一直保持相配。




2008-12-15 15:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复
nanhezzb
初级用户





积分 37
发帖 32
注册 2008-8-21
状态 离线
『第 15 楼』:  



  Quote:
Originally posted by HAT at 2008-12-15 03:02 PM:
先看帮助,后提问。
set /?
[box=#000000]环境变量替换已如下增强:

    %PATH:str1=str2%

会扩展 PATH 环境变量,用 "str2" 代替扩展结果中 ...

帮助里面讲的太专业了,有些根本不理解,也没什么实际的例子。

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


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



论坛跳转: