我从批处理文件生成以下文本:
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..
有没有办法可以做到这一点呢?对不起,但我没有批量经验。
答案 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。