用于替换括号的批处理脚本
Batch script to replace parentheses
我有一个包含超过 32,000 行注释机器代码的 .txt 文档。它看起来像这样:
; Display menu window
C0/000E: E220 SEP # (Set 8-bit accumulator)
C0/0010: C210 REP # (Set 16-bit X and Y)
为了编译目的,我需要按如下方式转换注释:
; Display menu window
C0/000E: E220 SEP # ; Set 8-bit accumulator
C0/0010: C210 REP # ; Set 16-bit X and Y
具体来说,这意味着:
- 如果该行不是以 "C0/" 开头,则什么也不做。
- 如果第 34 个字符不是左括号,则该行可能只包含数据,所以什么都不做。
- 如果是左括号,将其替换为分号和空格
- 然后,找到并删除右括号。如果在同一行上发现 none 最好放弃,但这不是必需的。
请注意,此板将制表符替换为多个空格,因此左括号对您来说不会是第 34 个字符。
理想情况下,我想要一个允许我拖放文档(例如 abc.txt)并自动获取不同文件(例如 abc2.txt)的批处理脚本.但这不是强制性的。
编辑:必须强调的是代码本身可以包含括号,所以简单的查找和替换不是一种选择。示例:
C0/0000: 7C0600 JMP ([=12=]06,X) (Display window X)
第一部分是关于提取文件到您的 bat,生成输出名称并清除目标文件。
在代码的第二部分,我们将逐一检查您的条件,并仅在所有条件都符合当前行时才执行替换。
@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,2!"=="C0" (
IF "!currentLine:~34,1!"=="(" (
SET left=!currentLine:~0,33!
SET right=!currentLine:~34!
ECHO !right!
SET right=!right:(=; !
SET right=!right:^)=!
ECHO !right!
SET currentLine=!left!!right!
)
)
ECHO !currentline!>>!target!
)
)
正如您所提到的,在解释制表符和空格时可能存在问题。在我的例子中(我从你的 post 复制了你的输入文件)我不得不使用这个:
...
IF "!currentLine:~39,1!"=="(" (
SET left=!currentLine:~0,38!
SET right=!currentLine:~39!
...
我有一个包含超过 32,000 行注释机器代码的 .txt 文档。它看起来像这样:
; Display menu window
C0/000E: E220 SEP # (Set 8-bit accumulator)
C0/0010: C210 REP # (Set 16-bit X and Y)
为了编译目的,我需要按如下方式转换注释:
; Display menu window
C0/000E: E220 SEP # ; Set 8-bit accumulator
C0/0010: C210 REP # ; Set 16-bit X and Y
具体来说,这意味着:
- 如果该行不是以 "C0/" 开头,则什么也不做。
- 如果第 34 个字符不是左括号,则该行可能只包含数据,所以什么都不做。
- 如果是左括号,将其替换为分号和空格
- 然后,找到并删除右括号。如果在同一行上发现 none 最好放弃,但这不是必需的。
请注意,此板将制表符替换为多个空格,因此左括号对您来说不会是第 34 个字符。
理想情况下,我想要一个允许我拖放文档(例如 abc.txt)并自动获取不同文件(例如 abc2.txt)的批处理脚本.但这不是强制性的。
编辑:必须强调的是代码本身可以包含括号,所以简单的查找和替换不是一种选择。示例:
C0/0000: 7C0600 JMP ([=12=]06,X) (Display window X)
第一部分是关于提取文件到您的 bat,生成输出名称并清除目标文件。
在代码的第二部分,我们将逐一检查您的条件,并仅在所有条件都符合当前行时才执行替换。
@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,2!"=="C0" (
IF "!currentLine:~34,1!"=="(" (
SET left=!currentLine:~0,33!
SET right=!currentLine:~34!
ECHO !right!
SET right=!right:(=; !
SET right=!right:^)=!
ECHO !right!
SET currentLine=!left!!right!
)
)
ECHO !currentline!>>!target!
)
)
正如您所提到的,在解释制表符和空格时可能存在问题。在我的例子中(我从你的 post 复制了你的输入文件)我不得不使用这个:
...
IF "!currentLine:~39,1!"=="(" (
SET left=!currentLine:~0,38!
SET right=!currentLine:~39!
...