Board logo

标题: [文本处理] [已解决]批处理for /f语句如何指定提取任意项结果? [打印本页]

作者: pZjVa0    时间: 2013-6-30 11:10     标题: [已解决]批处理for /f语句如何指定提取任意项结果?

本帖最后由 pZjVa0 于 2013-7-1 08:43 编辑

翻了两次批处理for入门到精通.txt里面介绍了采用tokens来提取自定义项的字符串举个例子

1.txt
  1. ssssss 'aa433' fffffffff
  2. ffd
  3. y44t4thvh
  4. ggggg 'sscc'445' hhhhhh
复制代码
如果要提取'号中的关键词在 行数 不确定的情况下如何可以提取第二项的结果?
作者: terse    时间: 2013-6-30 13:29

不确定你所说的 "第二项" 是列还是行 这样?
  1. @echo off
  2. for /f "tokens=2 delims='" %%i in (1.txt) do echo %%i
  3. pause
复制代码

作者: pZjVa0    时间: 2013-6-30 15:49

回复 2# terse
  1. PERFORMER "abc"
  2. TITLE "test"
  3. REM GENRE Pop
  4. REM DATE 2012
  5. REM DISCID 6909B80A
  6. REM COMMENT "ExactAudioCopy v0.99pb4"
  7. FILE "CDImage.wav" WAVE
复制代码
如果我要捕捉CDImage.wav这个关键词,首先用了引号作分隔
  1. (for /f skip^=6^ tokens^=2^ delims^=^" %%c in (CDImage.cue) do if not defined c set c=%%c)
复制代码
但是遇到了下面的文本后,原来的代码就失效了
  1. PERFORMER "abc"
  2. TITLE "test"
  3. DATE 2009
  4. REM DISCID 7F08A30A
  5. REM COMMENT "ExactAudioCopy v0.99pb5"
  6. FILE "CDImage.wav" WAVE
  7.   TRACK 01 AUDIO
  8.     TITLE "abc123"
  9.     PERFORMER "ccc"
复制代码
结果变成了 "abc123",我的问题是,在保持捕捉的字符串依然是双引号中的第四个单词的情况下,行数不确定,如何才可以正确的捕捉,谢谢。
作者: terse    时间: 2013-6-30 15:55

本帖最后由 terse 于 2013-6-30 16:04 编辑

先匹配 再处理
  1. @echo off
  2. for /f tokens^=2^ delims^=^" %%i in ('findstr /ic:" \"CDImage.wav\" " "e.txt"') do set a=%%i
  3. echo %a%
  4. pause’
复制代码

作者: pZjVa0    时间: 2013-6-30 16:24

回复 4# terse

问题的重点在于前后文 FILE "CDImage.wav" WAVE 外,双引号内的关键词是不确定的,这种情况下还有办法可以截取到里面的关键词吗?
作者: apang    时间: 2013-6-30 16:34

  1. @echo off
  2. for /f tokens^=2^ delims^=^" %%a in (a.txt) do (
  3.    if not "%%a"=="" (
  4.       set /a n+=1
  5.       setlocal enabledelayedexpansion
  6.       if !n!==4 (endlocal&echo,%%a) else endlocal
  7.    )
  8. )
  9. pause
复制代码
  1. @echo off
  2. for /f tokens^=2^ delims^=^" %%a in (a.txt) do (
  3.    if not "%%a"=="" (
  4.       set /a "n+=1,1/(n-4)" 2>nul||echo,%%a
  5.    )
  6. )
  7. 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,判断条件是
  1. PERFORMER "1"
  2. TITLE "2"
  3. DATE 2009
  4. REM DISCID 7F08A30A
  5. REM COMMENT "3"
  6. FILE "4" WAVE
  7.   TRACK 01 AUDIO
  8.     TITLE "abc123"
  9.     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 编辑

如果一行最多一对引号,那可以这样:
  1. @echo off
  2. for /f tokens^=2delims^="" %%a in ('"findstr ^"^"" a.txt|findstr /n .|findstr /b 4:"') do echo %%a
  3. pause
复制代码
如果一行中可能有两对引号,且引号内的关键词不含 * 或 ? 字符,则可以这样:
  1. @echo off
  2. set "n=4"
  3. (for /f "delims=" %%a in (a.txt) do (
  4. for %%b in (%%a) do (
  5. if %%b neq %%~b set /a n-=1,1/n||echo %%b
  6. )
  7. )) 2>nul
  8. pause
复制代码

作者: CrLf    时间: 2013-6-30 22:23

如果可以用第三方的话,更简单:
  1. gawk "BEGIN{RS=\"\x22\";}{if(n++==7)print $0}" a.txt
复制代码

作者: terse    时间: 2013-6-30 22:58

文件不大这个好
  1. @echo off
  2. for /f tokens^=2delims^=^" %%i in ('findstr ^^^""" a.txt^|findstr /n .^|findstr /b 4:') do echo %%i
  3. 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