批量脚本编辑以替换文本

时间:2015-07-24 02:48:19

标签: windows batch-file

我有一个包含超过32,000行评论机器代码的.txt文档。它看起来像这样:

Display menu window
C0/000E:    E220        SEP #$20       (Set 8-bit accumulator)
C0/0010:    C210        JSR $0011      (Call function X)

我需要将其转换如下:

Display menu window
C0/000E:    E220        SEP #$20       (Set 8-bit accumulator)
C0/0010:    C210        JSR C00011     (Call function X)

具体来说,这意味着脚本必须:

  1. 略过空白行
  2. 跳过不以" C0 /"
  3. 开头的行
  4. 检查" JSR $"是第25个字符。 (假设我的计数是正确的)
  5. 替换" JSR $"与" JSR C0" (最好用" C0")
  6. 替换" $"
  7. 删除" JSR C0XXXX"之后的空格保持评论一致,因为我们刚刚添加了一个字符($ - > C3)。
  8. 我有这个代码,我一直在努力编辑以实现这一目标。你可以修理它或自己编写。

    @ECHO OFF
    SETLOCAL ENABLEDELAYEDEXPANSION
    SET source=%1
    
    FOR /F "tokens=1 delims=." %%t IN ("%source%") DO SET target=%%t
    SET target=!target!_2.txt
    TYPE NUL>!target!
    
    FOR /F "tokens=1* delims=]" %%j in ('type "%source%" ^| find /V /N ""') DO (
        IF "%%k"=="" (
            ECHO.>>!target!
        ) ELSE (
            SET currentLine=%%k
            IF "!currentLine:~0,3!"=="C0/" (
                IF "!currentLine:~25,5"=="JSR $" (
                    SET left=!currentLine:~0,24!
                    SET right=!currentLine:~25!
                    ECHO !right!
                    SET right=!right:(=C0!
                    SET right=!right:^)=!
                    ECHO !right!
                    SET currentLine=!left!!right!
                )
            )
            ECHO !currentline!>>!target!
        )
    )
    

1 个答案:

答案 0 :(得分:1)

您可以使用%~dpn1获取驱动器,路径和基本名称,而不使用扩展名。

在循环外只输出一次更好 - 不再需要将其初始化为空,而且速度更快。

当FIND可以直接读取文件时,无需将TYPE传递给FIND。

你的计数错了,你的逻辑完全错了。在没有任何中间变量的情况下直接构造线是相当容易的。

无需多个ECHO声明。只需始终定义currentLine,并测试它是否已定义(非空)。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

>"%~dpn1_2.txt" (
  FOR /F "tokens=1* delims=]" %%j in ('find /V /N "" %1') DO (
    set "currentLine=%%k"
    IF DEFINED currentLine (
      IF "!currentLine:~0,3!"=="C0/" (
        IF "!currentLine:~24,5!"=="JSR $" (
          SET "currentLine=!currentLine:~0,28!C0!currentLine:~29,4!!currentLine:~34!"
        )
      )
    )
    ECHO(!currentline!
  )
)

或者您可以更轻松地使用JREPL.BAT - a regular expression text processing utility。 JREPL.BAT是纯脚本(Jscript / batch hybrid),可以在XP之后的任何Windows机器上本地运行。

@call jrepl "^(C0/.{21}JSR )\$(.*?) " "$1C0$2" /f %1 /o "%~dpn1_2.txt"