批处理:将双引号之间的.text字符串写入.txt

时间:2015-03-23 11:54:13

标签: batch-file cmd findstr

我即将编写一个批处理文件来从文本文件中获取行,并仅在两个""之间写入内容。 (双引号)到另一个文本文件。

如参见。的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 
)

有人可以帮我解决我的问题吗?

2 个答案:

答案 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