标题: [已结]文本中按行提取特定字符开头的字符串的问题。
[打印本页]
作者: nanhezzb
时间: 2008-12-14 16:54
标题: [已结]文本中按行提取特定字符开头的字符串的问题。
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 ]
作者: tireless
时间: 2008-12-14 17:36
@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
作者: tireless
时间: 2008-12-14 18:12
标题: 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
作者: HAT
时间: 2008-12-15 10:54
撇开批处理不谈,你是如何用人工提取路径信息的呢?你把规律总结出来,自然有人告诉你如何写代码。
作者: nanhezzb
时间: 2008-12-15 12:06
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 ]
作者: nafan
时间: 2008-12-15 13:21
没有来得及细想,是否可以按照这个思路呢:
先按照" - "分隔符号把文本分成一个一个字段
然后提取包含:\的字段。
作者: nafan
时间: 2008-12-15 13:25
建议用awk 或者grep
作者: slore
时间: 2008-12-15 13:32
空格-空格替换为某字符……
然后分割……
文件路径带" - "的话会出问题,不过个人认为大部分都不会除了歌曲那些东西
作者: a794685135
时间: 2008-12-15 13:43
按照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
作者: slore
时间: 2008-12-15 14:00
。。。少说了点……
先:分割……
前半部分set取最后一个字符得到Driver
后部分再按8楼走……
后面也可以一个个取。。。自己匹配吧
作者: nanhezzb
时间: 2008-12-15 14:32
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 ]
作者: tireless
时间: 2008-12-15 14:44
@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
作者: nanhezzb
时间: 2008-12-15 14:59
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 ]
作者: HAT
时间: 2008-12-15 15:02
标题: Re 13楼
先看帮助,后提问。
set /?
环境变量替换已如下增强:
%PATH:str1=str2%
会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的
开始到 str1 剩余部分第一次出现的地方,都一直保持相配。
作者: nanhezzb
时间: 2008-12-15 15:10
Quote: |
Originally posted by HAT at 2008-12-15 03:02 PM:
先看帮助,后提问。
set /?
[box=#000000]环境变量替换已如下增强:
%PATH:str1=str2%
会扩展 PATH 环境变量,用 "str2" 代替扩展结果中 ... |
|
帮助里面讲的太专业了,有些根本不理解,也没什么实际的例子。
作者: HAT
时间: 2008-12-15 15:11
标题: Re 15楼
帮助中哪里看不懂就再问,至少表明你曾经看过帮助。
作者: nanhezzb
时间: 2008-12-15 15:17
主要是set a=!a: - =(!这个是将空格-空格做什么操作呢?=(什么意思?其他基本明白了!
感谢各位大侠的帮助,让我对set命令有了进一步的了解!
作者: nafan
时间: 2008-12-15 15:24
Quote: |
Originally posted by tireless at 2008-12-15 14:44:
[code]@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:%% ... |
|
看的有点晕,能否详细讲解下呢,呵呵。
作者: HAT
时间: 2008-12-15 15:28
标题: Re 17楼
英文版的是否更清楚呢?
Environment variable substitution has been enhanced as follows:
%PATH:str1=str2%
would expand the PATH environment variable, substituting each occurrence
of "str1" in the expanded result with "str2". "str2" can be the empty
string to effectively delete all occurrences of "str1" from the expanded
output. "str1" can begin with an asterisk, in which case it will match
everything from the beginning of the expanded output to the first
occurrence of the remaining portion of str1.
就是把等号左边的字符串替换为等号右边的字符串,现在清楚不?
作者: nanhezzb
时间: 2008-12-15 15:39
刚才有仔细的研究的,终于理解了。谢谢版主和其他热心的朋友了。
作者: a794685135
时间: 2008-12-15 21:14
set a=!a: - =(!
将a变量里面含有“ - ”的改成"(",当然这个"("随便你用什么,为了避免其他的问题出现我就随便弄了个
只能说a是个容器,,
b是为了判断是不是找到了你要的结果
作者: a794685135
时间: 2008-12-15 21:17
Quote: |
Originally posted by HAT at 2008-12-15 03:28 PM:
英文版的是否更清楚呢?
[box=#000000]Environment variable substitution has been enhanced as follows:
%PATH:str1=str2%
would expand the PATH environment variable, s ... |
|
还是HAT 牛X ,, 貌似英文的是清楚些了