我即将编写一个批处理文件来从文本文件中获取行,并仅在两个""之间写入内容。 (双引号)到另一个文本文件。
如参见。的FileInput:
WRITE 1,48,1,"1> MODUL 2 TYPENKONTROLLE "
WRITE 1,56,1,"2> MODUL 6 PRAEGETIEFE "
Some other text...
WRITE 1,64,1,"__________________________"
fileoutput:
"1> MODUL 2 TYPECONTROLE "
"2> MODUL 6 PRAEGETIEFE "
"__________________________"
我没有工作批次:
@echo File:
set /p file=
FOR /F delims^=^" %%i in ('findstr -i -r -c:"[\"]^" %file%.txt') do (
echo %%i >> %file%strings.txt
)
我想我需要这样的事情:
@echo File:
set /p file=
FOR /F delims^=^" tokens^=1,2 %%i in ('findstr -i -r -c:"[\"]^" %file%.txt') do (
echo %%i not needed!
echo %%j >> %file%strings.txt
)
有人可以帮我解决我的问题吗?
答案 0 :(得分:0)
最简单的解决方案是使用grep。你需要binaries and dependencies。那么你可以
grep -E -o "\".+\"" infile.txt > outfile.txt
获得你想要的输出。
在纯批处理中完成此操作的难点在于批处理将引号视为标记分隔符。一些包含重定向符号(>
符号)的行进一步使问题复杂化。虽然将引号和>
符号视为独立字符并不容易,但这是可能的。
@echo off
setlocal
>outfile.txt (
(
for /f "usebackq delims=" %%I in ("infile.txt") do (
call :get_stuff_between_quotes %%I
)
)
)
goto :EOF
:: // END MAIN RUNTIME
:: // get_stuff_between_quotes function
:: // echoes stuff between (and including) quotation marks
:: // echoes nothing if no quotation marks in argument
:get_stuff_between_quotes
:: // use delayed expansion to prevent evaluation of >
setlocal enabledelayedexpansion
set line=%*
:: // strip everything before first quotation mark
set line=!line:*"=!
:: // if line is unchanged, it didn't contain quotation marks.
if "!line!"=="%*" endlocal & goto :EOF
:: // otherwise, re-echo the leading quotation mark + the rest of the line
echo("!line!
endlocal & goto :EOF
虽然我不那么谦虚,但grep
解决方案更容易理解。
答案 1 :(得分:0)
如果您正在寻找纯批量解决方案,那么这可能就是您所需要的。它在FOR / F选项中使用令人讨厌的转义序列,以允许将"
指定为您的标记分隔符。
@echo off
>"output.txt" (
for /f usebackq^ tokens^=2^ delims^=^" %%A in ("input.txt") do echo "%%A"
)
如果要确保结束引用存在,则可以将FINDSTR添加到DO子句中。 FINDSTR希望报价转义为\"
。
@echo off
>"output.txt" (
for /f usebackq^ tokens^=2^ delims^=^" %%A in ('findstr \".*\" "input.txt"') do echo "%%A"
)
以上解决方案仅从任何一行写出第一个引用的字符串。其他引用的字符串将被忽略。
但我通常使用JREPL.BAT regular expression text utility来操纵文字。它是一个混合JScript /批处理脚本,可以在XP以后的任何Windows机器上本机运行。
假设您的PATH包含一个包含JREPL.BAT的文件夹,那么您需要的是命令行中的以下内容:
jrepl "\q.*?\q" $0 /x /jmatch /f input.txt /o output.txt
由于JREPL是一个批处理脚本,如果在另一个批处理脚本中使用该命令,则需要使用CALL JREPL。
请注意,即使在同一源代码行中有两个带引号的字符串,上述JREPL解决方案也会在单独的行上写出每个引用的字符串。如果您只想要来自任何行的第一个引用字符串,那么解决方案将变为
jrepl "(\q.*?\q).*" $1 /x /jmatch /f input.txt /o output.txt