我有一个包含超过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)
具体来说,这意味着脚本必须:
我有这个代码,我一直在努力编辑以实现这一目标。你可以修理它或自己编写。
@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!
)
)
答案 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"