标题: [文本处理] [已解决]批处理for /f语句如何指定提取任意项结果? [打印本页]
作者: pZjVa0 时间: 2013-6-30 11:10 标题: [已解决]批处理for /f语句如何指定提取任意项结果?
本帖最后由 pZjVa0 于 2013-7-1 08:43 编辑
翻了两次批处理for入门到精通.txt里面介绍了采用tokens来提取自定义项的字符串举个例子
1.txt- ssssss 'aa433' fffffffff
- ffd
- y44t4thvh
- ggggg 'sscc'445' hhhhhh
复制代码
如果要提取'号中的关键词在 行数 不确定的情况下如何可以提取第二项的结果?
作者: terse 时间: 2013-6-30 13:29
不确定你所说的 "第二项" 是列还是行 这样?- @echo off
- for /f "tokens=2 delims='" %%i in (1.txt) do echo %%i
- pause
复制代码
作者: pZjVa0 时间: 2013-6-30 15:49
回复 2# terse - PERFORMER "abc"
- TITLE "test"
- REM GENRE Pop
- REM DATE 2012
- REM DISCID 6909B80A
- REM COMMENT "ExactAudioCopy v0.99pb4"
- FILE "CDImage.wav" WAVE
复制代码
如果我要捕捉CDImage.wav这个关键词,首先用了引号作分隔- (for /f skip^=6^ tokens^=2^ delims^=^" %%c in (CDImage.cue) do if not defined c set c=%%c)
复制代码
但是遇到了下面的文本后,原来的代码就失效了- PERFORMER "abc"
- TITLE "test"
- DATE 2009
- REM DISCID 7F08A30A
- REM COMMENT "ExactAudioCopy v0.99pb5"
- FILE "CDImage.wav" WAVE
- TRACK 01 AUDIO
- TITLE "abc123"
- PERFORMER "ccc"
复制代码
结果变成了 "abc123",我的问题是,在保持捕捉的字符串依然是双引号中的第四个单词的情况下,行数不确定,如何才可以正确的捕捉,谢谢。
作者: terse 时间: 2013-6-30 15:55
本帖最后由 terse 于 2013-6-30 16:04 编辑
先匹配 再处理- @echo off
- for /f tokens^=2^ delims^=^" %%i in ('findstr /ic:" \"CDImage.wav\" " "e.txt"') do set a=%%i
- echo %a%
- pause’
复制代码
作者: pZjVa0 时间: 2013-6-30 16:24
回复 4# terse
问题的重点在于前后文 FILE "CDImage.wav" WAVE 外,双引号内的关键词是不确定的,这种情况下还有办法可以截取到里面的关键词吗?
作者: apang 时间: 2013-6-30 16:34
- @echo off
- for /f tokens^=2^ delims^=^" %%a in (a.txt) do (
- if not "%%a"=="" (
- set /a n+=1
- setlocal enabledelayedexpansion
- if !n!==4 (endlocal&echo,%%a) else endlocal
- )
- )
- pause
复制代码
- @echo off
- for /f tokens^=2^ delims^=^" %%a in (a.txt) do (
- if not "%%a"=="" (
- set /a "n+=1,1/(n-4)" 2>nul||echo,%%a
- )
- )
- pause
复制代码
作者: CrLf 时间: 2013-6-30 17:05
看了两遍,没看懂你的目的到底是固定提取第6行的引号内关键词,还是提取“双引号中的第四个单词”,还是根据前后文关键词 FILE "xxx" wav 提取引号内的内容
求助要把目的表达清楚啊...
作者: pZjVa0 时间: 2013-6-30 20:51
本帖最后由 pZjVa0 于 2013-6-30 20:52 编辑
回复 7# CrLf
非常抱歉我的表达让你困惑了,其实我的原意就是提取“还是根据前后文关键词 FILE "xxx" wav 提取引号内的内容” 中的xxx,判断条件是- PERFORMER "1"
- TITLE "2"
- DATE 2009
- REM DISCID 7F08A30A
- REM COMMENT "3"
- FILE "4" WAVE
- TRACK 01 AUDIO
- TITLE "abc123"
- PERFORMER "ccc"
复制代码
无论行数怎么变化,"4" 永远都是从第一行开始计算 第四个带双引号的单词,能理解我意思吗?(他可能在第6行,或第9行,或第11行, 但他永远是第四个双引号内的单词)
作者: terse 时间: 2013-6-30 21:18
6楼代码试过没
作者: CrLf 时间: 2013-6-30 21:55
本帖最后由 CrLf 于 2013-6-30 23:04 编辑
如果一行最多一对引号,那可以这样:- @echo off
- for /f tokens^=2delims^="" %%a in ('"findstr ^"^"" a.txt|findstr /n .|findstr /b 4:"') do echo %%a
- pause
复制代码
如果一行中可能有两对引号,且引号内的关键词不含 * 或 ? 字符,则可以这样:- @echo off
- set "n=4"
- (for /f "delims=" %%a in (a.txt) do (
- for %%b in (%%a) do (
- if %%b neq %%~b set /a n-=1,1/n||echo %%b
- )
- )) 2>nul
- pause
复制代码
作者: CrLf 时间: 2013-6-30 22:23
如果可以用第三方的话,更简单:- gawk "BEGIN{RS=\"\x22\";}{if(n++==7)print $0}" a.txt
复制代码
作者: terse 时间: 2013-6-30 22:58
文件不大这个好- @echo off
- for /f tokens^=2delims^=^" %%i in ('findstr ^^^""" a.txt^|findstr /n .^|findstr /b 4:') do echo %%i
- pause
复制代码
作者: pZjVa0 时间: 2013-7-1 08:43
回复 11# CrLf
感谢CrLf热心帮忙,问题已解决。
作者: wskwfkbdn 时间: 2013-7-14 00:26
回复 3# pZjVa0
PERFORMER "abc"
TITLE "test"
REM GENRE Pop
REM DATE 2012
REM DISCID 6909B80A
REM COMMENT "ExactAudioCopy v0.99pb4"
FILE "CDImage.wav" WAVE
以上内容保存为 1.TXT
@echo off
for /f "tokens=2 delims= " %%i in ('type 1.txt^|findstr /i ".wav"') do echo %%~i
pause
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |