gpt4 book ai didi

batch-file - 批处理文件 - 找到两行然后复制这两行之间的所有内容

转载 作者:行者123 更新时间:2023-12-02 00:57:00 24 4
gpt4 key购买 nike

我需要解析一个文本文件。我想在文本文件中找到第一行

: the first line to find
set firstLine=------------------------------------------------------------------------------------------------------------------

找到最后一行

:: the last line to find
set lastLine=*******************************************************************************************************************

然后我需要将这两行之间的所有内容导出到一个新文件。

echo     >> M:\TESTING\Output.txt

我是这方面的初学者,我已经搜索了好几天,但没有找到如何做到这一点。

我查看了 for 循环和 if 语句,但我仍然感到困惑。

    for /f "tokens=1 delims= " %%f in (M:\TESTING\*.txt) do (

:: sets then the line variable to the line just read
set line=%%f
:: the first line to find
set firstLine=------------------------------------------------------------------------------------------------------------------
:: the last line to find
set lastLine=*******************************************************************************************************************

Then if %line% = %fistLine% start the export.....

任何方向将不胜感激。谢谢。

最佳答案

@DennisvanGils' approach是一个好的开始,在很多情况下都会做得很好。
但是,它不会在给定行之间生成文本文件内容的精确副本:

  • 前导空格(SPACETAB)将被删除(由于 tokens=* 选项),
  • ; 开头的行将被跳过(由于 eol=; 的默认选项 for /F),并且
  • 也将跳过空行(因为 for /F 总是跳过此类)。

要获得文本文件部分的精确副本,您可以使用以下代码片段:

@echo off
set "INFILE=M:\TESTING\input.txt"
set "OUTFILE=M:\TESTING\output.txt"
set "FIRSTLINE=------------------------------------------------------------------------------------------------------------------"
set "LASTLINE=*******************************************************************************************************************"
setlocal EnableExtensions DisableDelayedExpansion
set "FLAG="
> "%OUTFILE%" (
for /F "delims=" %%L in ('findstr /N "^" "%INFILE%"') do (
set "LINE=%%L"
setlocal EnableDelayedExpansion
set "LINE=!LINE:*:=!"
if "!LINE!"=="%FIRSTLINE%" (
endlocal
set "FLAG=TRUE"
) else if "!LINE!"=="%LASTLINE%" (
endlocal
goto :CONTINUE
) else if defined FLAG (
echo(!LINE!
endlocal
) else (
endlocal
)
)
)
:CONTINUE
endlocal

这里的核心函数是findstr , 它被配置为返回文件中的每一行,并以行号和冒号为前缀 : .然后它的输出被 for /F 解析环形。由于前缀,没有一行看起来是空的,因此每一行都被循环迭代。在循环体中,前缀被 set "LINE=!LINE:*:=!" 删除每行的命令。

变量FLAG用于决定是否输出当前行;如果已定义,即赋值,命令echo !LINE!被执行;否则它不是。 FLAG如果当前行与 %FIRSTLINE% 中的字符串匹配则设置;如果该行与 %LASTLINE% 中的字符串匹配, 一个 goto命令被执行,它打破了循环。这也意味着只有 %FIRSTLINE% 之间的第一个 block 。和 %LASTLINE%匹配是输出。

如果可能出现多个%FIRSTLINE%%LASTLINE%在文本文件中匹配并且你想输出每个 block ,替换 goto命令行 set "FLAG=" .

请注意,此方法不会检查 %FIRSTLINE% 是否为发生在 %LASTLINE% 之前,它甚至不检查 %LASTLINE% 是否存在(以防万一,输出文件末尾的所有剩余行)。如果所有这些都很重要,则需要改进逻辑,甚至很可能需要第二个循环。

关于batch-file - 批处理文件 - 找到两行然后复制这两行之间的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33638832/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com