批处理文件帮助仅在两个匹配字符串之间复制文本

Posted

技术标签:

【中文标题】批处理文件帮助仅在两个匹配字符串之间复制文本【英文标题】:Batch file help copy text between two matching strings only 【发布时间】:2020-04-01 12:37:04 【问题描述】:

所以我有一个看起来像这样的日志文本文件....但是还有数千个条目,需要将数据从 801 C 复制到下一个 Nr 到新文本(实际上只需要行中的数据带时间戳)所以我可以将 Std-Id 下的 3 更改为 27,因为这是每个时间戳行唯一可用的数据,该行将该行与该颜色标准联系起来,并且由于标准如何,它们共享相同数字的多个时间戳行存储在光谱仪中。此外,801 C 的条目可能会在同一个日志中出现多次,并且能够捕获所有实例,如果两个刺似乎都需要提取其中的文本。

      Nr:END                              Std-Id          L*          a*          b*
             VS410  SN:000178                                                   
             D65/10?         
       Std   801 C:START                           3       30.21       -0.02       -0.54     
         1   12/2/2019 2:17:45 AM          3       30.03       -0.03       -0.60
         2   12/2/2019 2:18:39 AM          3       29.89       -0.01       -0.71          
      Nr:END                              Std-Id          L*          a*          b*
             VS410  SN:000178   
             D65/10?                                                        
       Std   706 C                         6       35.17        2.79        1.17  
         1   12/2/2019 8:47:54 AM          6       35.22        2.50        0.62     
         2   12/2/2019 8:48:06 AM          6       35.45        2.50        0.63    
      Nr:END                              Std-Id          L*          a*          b*
             VS410  SN:000178   
             D65/10?   
       Std   706 BBA                       5       34.55        3.06        1.16
         1   12/2/2019 10:35:05 AM         5       36.55        2.68        0.66
         2   12/2/2019 10:35:35 AM         5       35.38        2.73        0.66
      Nr:END                              Std-Id          L*          a*          b*
             VS410  SN:000178   
             D65/10?   
       Std   703 C                         3       34.55        3.06        1.16
         1   12/2/2019 10:35:05 AM         3       36.55        2.68        0.66
         2   12/2/2019 10:35:35 AM         3       35.38        2.73        0.66

下面的预期输出

       Std   801 C:START                           3       30.21       -0.02       -0.54     
         1   12/2/2019 2:17:45 AM          3       30.03       -0.03       -0.60
         2   12/2/2019 2:18:39 AM          3       29.89       -0.01       -0.71          
      Nr:END                              Std-Id          L*          a*          

我目前得到的

      Nr:END                              Std-Id          L*          a*          b*
             VS410  SN:000178                                                   
             D65/10?         
       Std   801 C:START                           3       30.21       -0.02       -0.54     
         1   12/2/2019 2:17:45 AM          3       30.03       -0.03       -0.60
         2   12/2/2019 2:18:39 AM          3       29.89       -0.01       -0.71          
      Nr:END                              Std-Id          L*          a*          b*
             VS410  SN:000178   
             D65/10?                                                        
       Std   706 C                         6       35.17        2.79        1.17  
         1   12/2/2019 8:47:54 AM          6       35.22        2.50        0.62     
         2   12/2/2019 8:48:06 AM          6       35.45        2.50        0.63    
      Nr:END                              Std-Id          L*          a*          b*
             VS410  SN:000178   
             D65/10?   
       Std   706 BBA                       5       34.55        3.06        1.16
         1   12/2/2019 10:35:05 AM         5       36.55        2.68        0.66
         2   12/2/2019 10:35:35 AM         5       35.38        2.73        0.66
      Nr:END                              Std-Id          L*          a*          b*
\u001a

我尝试通过将 801 C 更改为 801 C:START 并将 Nr 更改为 Nr:END 来使用此批处理文件。但它捕获的不仅仅是第一个:END

@echo off
setlocal enableExtensions enableDelayedExpansion

set "source=G:\800SeriesFilter.txt"
set "target=G:\800Series.txt"


set "include=lines.tmp.txt"
set "source_n=source_n.tmp.txt"

> "%include%" (
    set "line="
    for /f "tokens=1 delims=:" %%a in ('findstr /n "START END" "%source%"') do (
        if defined line (
            for /l %%c in (!line!, 1, %%~a) do (
                echo(%%~c:
            )
            set "line="
        ) else (
            set "line=%%~a"
        )       
    )
)
> "%source_n%" findstr /n "^" "%source%"

setlocal enableExtensions disableDelayedExpansion
> "%target%" (
    for /f "tokens=1* delims=:" %%a in ('findstr /B /L /G:"%include%" "%source_n%"') do @echo(%%b
)

del "%include%"
del "%source_n%"

endlocal
endlocal
goto :eof

尝试使用 Batch 或 Vb-Script 或任何不需要用户输入即可运行的东西。试图自动化动态构建 Excel 文档的过程,以便任何人都可以双击它的 ftp 日志并添加所需的表格和图表的快捷方式。几天来,我一直在努力解决这个问题,但还没有找到一种确定的方法来完成它,而且我对批处理文件命令和 vb-script 非常陌生,这对我没有帮助。

【问题讨论】:

向您的问题添加以下内容:什么操作系统?什么版本的操作系统? 32 位还是 64 位? @somebadhat 批处理文件标签已经说明问题是关于 Windows 批处理文件的,关于 32 位或 64 位的信息与问题无关。甚至操作系统的版本也无关紧要,因为自 Win-XP 以来批处理文件语法没有改变 我不明白But it captures more than the first :END,您的原始文件中没有END。也许您还应该展示您期望的输出 编辑了我的问题以反映我是如何尝试提取文本的。 因此,以我试图让它工作的当前方式,它会找到第一个 :START 和每个 :END 到最后一个 :END 并复制其间的所有数据。我希望它找到第一个 :START 和第一个 :END 将这些行复制到一个新文件中,然后继续愉快地通过文档的其余部分查找仅 a :START 和 :END 之间的数据。 【参考方案1】:

您可以搜索第一个 START 并仅存储该行号。 然后再次读取文件,跳过统计行号之前的所有行。

然后回显每一行,直到检测到第一个END

@echo off
setlocal EnableDelayedExpansion
set "source=800SeriesFilter.txt"
set "target=800Series.txt"

set "lineno_start="
for /f "tokens=1 delims=:" %%a in ('findstr /n "START" "%source%"') do (
    set /a lineno_start=%%a-1
    goto :break
)
:break
set lineno_start

for /f "skip=%lineno_start% tokens=1,* delims=:" %%a in (%source%) do (
    set "line=%%b"
    echo(#!line!
    echo(!line! | findstr "END" > nul && goto :break
)
:break

【讨论】:

以上是关于批处理文件帮助仅在两个匹配字符串之间复制文本的主要内容,如果未能解决你的问题,请参考以下文章

Sed - 在两个字符串之间的匹配模式后插入带文本的行

仅在彼此直接相邻的大写字母之间插入空格[关闭]

使用批处理脚本读取文本文件并以不同的顺序将特定文本复制到新的文本文件中[关闭]

如何使批处理文件从网站读取文本然后将其写入文件? [复制]

Ember 2,仅在一个计算属性中处理两个或多个属性。如何按搜索文本和类别进行过滤

Python:如何将两个空行之间的文本读入字符串