[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理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
复制代码
如果要提取'号中的关键词在 行数 不确定的情况下如何可以提取第二项的结果?
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

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

TOP

回复 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",我的问题是,在保持捕捉的字符串依然是双引号中的第四个单词的情况下,行数不确定,如何才可以正确的捕捉,谢谢。

TOP

本帖最后由 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’
复制代码

TOP

回复 4# terse

问题的重点在于前后文 FILE "CDImage.wav" WAVE 外,双引号内的关键词是不确定的,这种情况下还有办法可以截取到里面的关键词吗?

TOP

  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
复制代码

TOP

看了两遍,没看懂你的目的到底是固定提取第6行的引号内关键词,还是提取“双引号中的第四个单词”,还是根据前后文关键词 FILE "xxx" wav 提取引号内的内容
求助要把目的表达清楚啊...

TOP

本帖最后由 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行, 但他永远是第四个双引号内的单词)

TOP

6楼代码试过没

TOP

本帖最后由 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
复制代码

TOP

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

TOP

文件不大这个好
  1. @echo off
  2. for /f tokens^=2delims^=^" %%i in ('findstr ^^^""" a.txt^|findstr /n .^|findstr /b 4:') do echo %%i
  3. pause
复制代码
1

评分人数

    • pZjVa0: 非常感谢,代码有效。技术 + 1

TOP

回复 11# CrLf


感谢CrLf热心帮忙,问题已解决。

TOP

回复 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

TOP

返回列表