|
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
|
|
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
|
|
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
状态 离线
|
|
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
|
|
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
|
|
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 |
|