Batch file 批处理文件,用于在多个.txt文件中复制特定文本和X之后的过去

Batch file 批处理文件,用于在多个.txt文件中复制特定文本和X之后的过去,batch-file,cmd,batchfile,Batch File,Cmd,Batchfile,我开始学习批处理文件命令,并成功地创建了一些基本脚本,以简化工作中的一些任务。 现在,我正在寻找一个自动化的重复任务,需要很多时间来完成。。。说我每天都在手动操作: 我在同一个文件夹中有一堆.txt文件,这些文本文件的内容如下: 评论行 开始(电子元件名称)(引脚数) 程序正文第1行 程序正文第2行 程序主体行X 结束 评论行 我正在做的是复制我正在工作的“电子部件的名称” 并在结束后粘贴。以下是一个例子: 开始BC547 3 程序正文第1行 程序正文第2行 程序主体行X 结束BC54

我开始学习批处理文件命令,并成功地创建了一些基本脚本,以简化工作中的一些任务。 现在,我正在寻找一个自动化的重复任务,需要很多时间来完成。。。说我每天都在手动操作: 我在同一个文件夹中有一堆.txt文件,这些文本文件的内容如下:


评论行

开始(电子元件名称)(引脚数)

程序正文第1行

程序正文第2行

程序主体行X

结束

评论行


我正在做的是复制我正在工作的“电子部件的名称” 并在结束后粘贴。以下是一个例子:


开始BC547 3

程序正文第1行

程序正文第2行

程序主体行X

结束BC547


在同一个文件中有许多空白端,你可以想象每天手动填充200到300个文本文件

在某些情况下,结构更改为:


评论行

开始(名称1)(管脚数)

评论行

启动(子电路1)(引脚数)

程序正文第1行

程序主体行X

结束(子电路1)

评论行

启动(子电路2)(引脚数)

程序正文第1行

程序主体行X

结束(子电路2)

评论行

启动(子电路)(引脚数)

程序正文第1行

程序主体行X

结束(子电路)

评论行

结束(名称1)

评论行


我将非常感谢如果有人可以使批处理代码复制完整的下一个单词后开始,并粘贴在下面的下一个结尾。当星型语法连续时,脚本必须能够确定第二种情况


提前感谢您的帮助

社区已确定,要求重新编码以满足一系列业务需求的开放式问题不属于StackOverflow问题的范围。但是我很无聊,无法控制自己

这个算法相当简单。迭代源文件的所有行。如果行以START开头,则解析出ID并将值推送到堆栈(数组)上。如果该行以END开头,则将最后一个堆栈值附加到该行并弹出堆栈。如果这一行不是以END开头,那么只需写下原始行即可

但批量生产并不是一件简单的事情

  • FOR/F忽略空行,因此FINDSTR/N用于在每行前面加上行号,后跟冒号。在循环中执行字符串操作以去除行号前缀
  • Batch没有对阵列的正式支持,但代码显示了如何模拟阵列
  • 括号内的代码块需要延迟扩展,因此数组成员不能作为
    访问!ID.%i%
    。代码显示了如何将当前
    i
    值转换为FOR变量,以便您可以使用
    !ID.%I
  • 延迟扩展在循环中打开和关闭,以保护任何
  • 无法写入正在读取的文件。因此,必须将结果写入一个临时的新文件,该文件稍后将被移动以替换原始文件
应使用一个或多个文件掩码调用下面的脚本,这些文件掩码指定应处理哪些文件。如果脚本名为“fixEnd.bat”,则
fixEnd test.txt
将处理当前目录中的test.txt
fixEnd“c:\somePath\*.txt”
将处理“c:\somePath”文件夹中的所有.txt文件
fixendfile1.txt file2.txt将处理当前目录中的这两个文件

@echo off
setlocal disableDelayedExpansion
for %%F in (%*) do (
  set /a i=0
  set "ID.0="
  >"%%F.new" (
    for /f "delims=" %%L in ('findstr /n "^" "test.txt"') do for /f "tokens=1,2,3 delims=: " %%A in ("%%L") do (
      if "%%B" == "START" (
        set /a i+=1
        setlocal enableDelayedExpansion
        for %%I in (!i!) do (
          endlocal
          set "ID.%%I=%%C"
        )
      )
      if "%%B" == "END" (
        setlocal enableDelayedExpansion
        for %%I in (!i!) do (
          (echo END !ID.%%I!)
          endlocal
          set "ID.%%I="
          set /a "1/i, i-=1)" 2>nul %= division by zero error prevents negative i values =%
        )
      ) else (
        set "ln=%%L"
        setlocal enableDelayedExpansion
        (echo(!ln:*:=!)
        endlocal
      )
    )
  )
  move /y "%%~F.new" "%%F" >nul
)
虽然我非常喜欢使用批处理的挑战,但我早就得出结论,除了非常简单的情况外,使用纯批处理来操作文本文件是不实际的。在许多情况下,批处理根本无法完成任务。这就是为什么我写了一个正则表达式文本处理实用程序,它是纯脚本(混合JScript/batch),从XP开始在任何Windows机器上运行

JREPL有无数的选项,这些选项赋予它巨大的功能,特别是在命令行中合并用户提供的JScript的能力。使用JREPL,同样的算法以更直接的方式实现,代码比纯批处理快得多:

@echo off
for %%F in (%*) do for %%F in (test.txt) do call jrepl^
  "^START\b\s*(\S*)/^END\b.*"^
  "id[id.length]=$2;$txt=$0/$txt='END '+(id.length?id[id.length-1]:'');id=id.slice(0,-1)"^
  /jbeg "var i=0, id=[]" /t "/" /jq /f "%%F" /o -

从命令行使用
jrepl/??
一次一个屏幕查看整个文档<代码>jrepl/?帮助
列出了所有可用的帮助类型<代码>jrepl/?选项
简要总结了所有可用选项
jrepl/?/t
将显示
/t
选项的帮助。等等。

本网站不为人们提供免费编码服务。在这里,您请求帮助解决由于调用自己的代码而遇到的特定问题。在这种情况下,您将发布代码的相关部分,并充分解释注意到的问题。如果你想雇人,请说明你的条件。