batch file从txt文件中删除前18个字符

我有一个.txt文件,超过32000行注释的机器代码。 它看起来像这样:

Display menu window C0/000E: E220 SEP #$20 C0/0010: C210 REP #$10 C0/0012: 20640B JSR $0B64 C0/0015: 20750B JSR $0B75 C0/0018: C220 REP #$20 C0/001A: A90001 LDA #$0100 

为了编译目的,我需要如下转换代码:

 ; Display menu window SEP #$20 REP #$10 JSR $0B64 JSR $0B75 REP #$20 LDA #$0100 

具体来说就是说:

  • 空白行必须保持不变。
  • 如果一行以“C0 /”开始,则前18个字符将被删除,包括标签。
  • 否则,这是一个函数标题,所以在开头添加一个分号,后面跟一个空格(不是强制的)。

任何帮助将不胜感激。

Solutions Collecting From Web of "batch file从txt文件中删除前18个字符"

下面的批处理文件是一种不同于其他类似方法的方法,但这在很大程度上取决于文件的大小:

 @echo off for /F "tokens=1-2*" %%a in ('findstr /N "^" test.txt') do ( for /F "tokens=1,2 delims=:/" %%d in ("%%a") do ( if "%%e" equ "C3" ( echo %%c ) else if "%%e" neq "" ( echo ; %%e %%b %%c ) else ( echo/ ) ) ) 

但是,最快的方法是通过Batch-JScript混合脚本。 用.bat扩展名保存下面的文件:

 @set @Batch=1 /* @cscript //nologo //E:JScript "%~F0" < test.txt @goto :EOF & rem */ WScript.Stdout.Write(WScript.Stdin.ReadAll().replace (/^C3\/.{15}|^(..)/gm,function(A){return A.length==2?"; "+A:""})); 

所以,下面的代码(这是在java btw中)将从你提供的文件中读取文本,处理它,并且如果行以C3/开始,将打印前18个字符被删除的行,并且打开空白开始和结束了。 如果该行不以C3/开始,那么该行将按原样打印。 (仅供参考,在处理你的巨大文本文件方面,这个java代码可能比批处理文件快,这就是为什么我首先推荐java的原因:P)

 import java.io.*; public class ClassName{ public static void main(String args[])throws IOException{ PrintWriter file_out = new PrintWriter("OutputFileName.txt"); BufferedReader br = new BufferedReader(new FileReader("OriginalFileName.txt")); String line, temp, out = ""; while((line = br.readLine()) != null){ temp = line.substring(0,3); if(temp.equals("C3/")){ out = line.substring(18, line.length()).trim(); file_out.println(out); }else{ file_out.println(line); } } file_out.close(); } } 

当然用你的文本文件替换OutputFileName.txtOriginalFileName.txt 。 要编译和运行这个,你需要安装和设置JDK 。 要了解如何做到这一点, 请点击这里 。 您还可以在Web上找到许多其他教程,以了解如何设置和使用JDK。 设置完JDK之后,将此代码保存为ClassName.java ,编译并运行它。 确保该程序保存在与您的输入/输出文件相同的文件夹中。

注:通常我不会给出这样的代码,但我很无聊,感觉很好:)

另外,我强烈建议你尝试用java编程一下自己。 这是一个非常有趣和多才多艺的语言。 如果您有任何其他问题,请随时通知我们:D。

示例输入:

 Display menu window C3/000E: E220 SEP #$20 C3/0010: C210 REP #$10 C3/0012: 20640B JSR $0B64 C3/0015: 20750B JSR $0B75 C3/0018: C220 REP #$20 C3/001A: A90001 LDA #$0100 

示例输出:

 Display menu window SEP #$20 REP #$10 JSR $0B64 JSR $0B75 REP #$20 LDA #$0100 

正则表达式替换的使用将解决您的单行问题:

 sed -i -- 's/C0\/.....................//g' <your_file_name> 

那当然假设你有sed。 我在linux中这样做,并且test.txt的内容被替换为你所需要的。

你可以尝试从这个网站的Windows版本的sed:

http://gnuwin32.sourceforge.net/packages/sed.htm

这个批处理文件应该符合你的要求。 只需将其保存为whatever.cmd并使用whatever.cmd file_to_process运行即可。 通过重定向stdout来保存输出,就像whatever.cmd file_to_process > processed_file

 @echo off set "DEL_TOKEN=C0/" set "DEL_TOKEN_LEN=3" set "CHARS_TO_REMOVE=18" set "FILENAME=%~1" SETLOCAL DisableDelayedExpansion FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ %FILENAME%"`) do ( set "LINE=%%a" SETLOCAL EnableDelayedExpansion set "LINE=!LINE:*:=!" if not "!LINE!"=="" ( if "!LINE:~0,%DEL_TOKEN_LEN%!"=="%DEL_TOKEN%" ( set "LINE=!LINE:~%CHARS_TO_REMOVE%!" ) else ( set "LINE=; !LINE!" ) ) echo(!LINE! ENDLOCAL ) 

线读者礼貌jeb 。

我通常使用JREPL.BAT在Windows命令行中进行正则表达式文本修改。

JREPL.BAT是一个纯粹的脚本(混合JScript /批处理)实用工具,可以在任何Windows机器上运行,从XP开始。 完整的文档嵌入在脚本中。

一条线就是你的问题所需要的。 假设你的文件是“test.in”,你的输出是“test.out”,那么:

 jrepl "^C0/.{15}|^." "|; $&" /t "|" /f test.in /o test.out 

如果你想覆盖原来的,然后使用/o -而不是。

JREPL解决方案速度非常快。

如果您想要纯批处理,那么您可以使用以下优化的解决方案:

 @echo off setlocal enableDelayedExpansion for /f %%N in ('find /c /v "" ^<test.txt') do set "cnt=%%N" <test.in >test.out ( for /l %%N in (1 1 %cnt%) do ( set "ln=" set /p "ln=" if "!ln:~0,3!" == "C0/" (set "ln=!ln:~18!") else if defined ln set "ln=; !ln!" echo(!ln! ) ) 

如果您想要覆盖原始内容,请将以下代码行添加到最后:

 move /y test.out test.in >nul