批量提取字符串中的文本值

时间:2017-01-11 16:15:35

标签: batch-file text scripting

我从批处理文件生成以下文本:

FILE:71.jpg 88557: ( 0, 0, 0) #000000 black 535: ( 0, 0,255) #0000FF blue 3617: ( 0,255, 0) #00FF00 lime 315: ( 0,255,255) #00FFFF cyan 9674: (255, 0, 0) #FF0000 red 214: (255, 0,255) #FF00FF magenta 5552: (255,255, 0) #FFFF00 yellow 11536: (255,255,255) #FFFFFF white

我希望按如下方式提取值:

8857: black
535: blue
3617: lime
etc..

有没有办法可以做到这一点呢?对不起,但我没有批量经验。

2 个答案:

答案 0 :(得分:1)

假设一个行字符串是文件File.txt中唯一的一个:

@Echo off
Set /P String=<File.txt
Set String=%String:(="%
Call :Sub %String:)="%
Goto :Eof
:Sub
shift
If "%~1"=="" Goto :Eof
Echo %1 | findstr "# ," >Nul 2>&1 && goto :sub
Set var=%1
If "%var:~-1%" equ ":" (set /p =%var% <Nul) Else Echo:%1 
goto :Sub

输出

88557: black
535: blue
3617: lime
315: cyan
9674: red
214: magenta
5552: yellow
11536: white

Set /p通过输入重定向从file.txt中读取一行 %String:(="%用双引号交换括号以便于解析 shift命令跳过第一个arg,然后进入下一个arg。 子中的发现者会消除不需要的元素 if检查当前参数是否有尾随冒号,如果是,则通过set / p输出没有crlf,如果不是简单地回显当前arg。

答案 1 :(得分:1)

以下是一个非常强大的脚本,它从作为命令行参数提供的文本文件中提取颜色信息。文本文件甚至可能包含多行。该脚本仅处理以文字字符串FILE:开头的行,后跟不包含:\ SPACE 的字符串(如{{1}在你的例子中)。所以这里是代码,包括一些解释性71.jpg注释:

rem

假设批处理文件保存为@echo off setlocal EnableExtensions DisableDelayedExpansion rem // Define constants here: set "_FILE=%~1" & rem // (`%~1`: specify input file by command line argument) rem // Read the input file line by line, split off prefix (`FILE:`): for /F "tokens=2,* eol=: delims=: " %%K in (' rem/ Filter for lines with matching prefix: ^& ^ findstr /R /C:"^FILE:[^:\\ ][^:\\ ]* *[0-9][0-9]*: *" "%_FILE%" ') do ( rem // Return prefixed file name at `STDERR` stream: >&2 echo **** %%K **** rem // Process current line without prefix in sub-routine: call :EXTRACT "%%L" ) endlocal exit /B :EXTRACT val_string setlocal DisableDelayedExpansion rem // Store string argument in variable: set "LINE=%~1" setlocal EnableDelayedExpansion :EXTRACT_LOOP rem // Check whether beginning of string matches a colour block: cmd /V /C echo(^^!LINE^^! | (> nul ^ findstr /R /I /C:"^[0-9][0-9]*: *( *[0-9][0-9]* *, *[0-9][0-9]* *, *[0-9][0-9]* *) *#[0-9A-F][0-9A-F]* *[a-z][a-z]* *" ) && ( rem // String matches, so continue; extract first number and word: for /F "tokens=1,6,* delims=:(,)# " %%A in ("!LINE!") do ( endlocal rem // Return number and word extracted from colour block: echo(%%A: %%B rem // Assign remainder to variable: set "LINE=%%C" setlocal EnableDelayedExpansion ) rem // Jump back to beginning of loop: goto :EXTRACT_LOOP ) endlocal endlocal exit /B 且文本文件名为extract-colours.bat,请运行如下脚本:

sample.txt

如果文本文件包含您的示例数据,则输出将为:

extract-colours.bat "sample.txt"

要将结果存储到另一个文本文件中,请使用此命令行:

 **** 71.jpg ****
88557: black
535: blue
3617: lime
315: cyan
9674: red
214: magenta
5552: yellow
11536: white

由于在 STDERR 流中返回一对extract-colours.bat "sample.txt" > "result.txt" (此处为****)之间的标题字符串部分,与输出到<的其他行相对em> STDOUT ,该标头不包含在文件中;要包含它,请将71.jpg附加到上述命令行;如果没有,要在控制台窗口中取消标题,请添加2>&1。阅读本文以了解所有这些意义:Redirection