Board logo

标题: [文本处理] 批处理如何截取hex文件中的一段? [打印本页]

作者: jzy8158    时间: 2021-6-25 17:00     标题: 批处理如何截取hex文件中的一段?

内容如下:
:02000004800179
:200000000A027536313531353230303033415254303030530680008000000016D08000979B
:200020000000031F8C801C4000000005E6801F0000000000AA801F2000000000F6802000AD
:02000004800971
:20000000000001000000B040666606410000000000000000000000000000000000000000DC
:200020000000000000000000000000000000000000000000000000000000000000000000C0
:200040000000000000000000000000000000000000000000000000000000000000000000A0
:20006000000000000000000000000000000000000000000000000000000000000000000080
:20008000000000000000000000000000000000000000000000000000000000000000000060
:2000A000000000000000000000000000000000000000000000000000000000000000000040
:2000C000000000000000000000000000000000000000000000000000000000000000000020
:02000004801F5B
:0A028000916000E8D9EEDA60DC0EB0
:0A02A000916000E8D9EEF480DC0E56
:0A02C000916000E8D9EECA90DC0E50

需要完成的操作是
(1) :02000004800971包括后面的7行全部截取出来,放到另外一个hex文件中,因为原文有几万行,这个精简了一下
(2)完成任务后,立即跳出for循环,因为有几万行,不跳出来,循环一遍时间比较长
(3)在新的hex末尾加上 :00000001FF
作者: newswan    时间: 2021-6-25 18:25

本帖最后由 newswan 于 2021-6-25 18:28 编辑

grep
  1. grep ":02000004800971" -A 7 1.txt >2.txt
  2. echo ":00000001FF">>2.txt
复制代码
powershell
  1. $file1 = "1.txt"
  2. $file2 = "2.txt"
  3. ((Get-Content -raw $file1) -match “:02000004800971(`n.*){7}”)
  4. $matches[0] + ":00000001FF" | out-file $file2
复制代码
`n 或者 `r`n
作者: idwma    时间: 2021-6-25 19:34

  1. @echo off&setlocal EnableDelayedExpansion
  2. set out=b.txt
  3. for /f %%a in (a.txt) do (
  4. set/a n+=1
  5. if %%a equ :02000004800971 set/a nn=!n!+8
  6. if !n! lss !nn! echo %%a >>!out!
  7. if !n! equ !nn! echo :00000001FF >> !out! & goto :oo
  8. )
  9. pause
  10. :oo
复制代码

作者: jzy8158    时间: 2021-6-28 15:37

回复 2# newswan


    最好只用bat脚本实现
作者: jzy8158    时间: 2021-6-28 15:39

回复 3# idwma


    这样好像FOR循环还是要执行完
作者: idwma    时间: 2021-6-28 15:51

回复 5# jzy8158


    加个回显可看到第几就退出了
  1.     @echo off&setlocal EnableDelayedExpansion
  2.     set out=b.txt
  3.     for /f %%a in (a.txt) do (
  4.     set/a n+=1
  5.     if %%a equ :02000004800971 set/a nn=!n!+8
  6.     if !n! lss !nn! echo %%a >>!out!
  7.     if !n! equ !nn! echo :00000001FF >> !out! & goto :oo
  8.     )
  9. :oo
  10. echo 第 !n! 行
  11.     pause
复制代码

作者: jzy8158    时间: 2021-6-28 16:38

回复 6# idwma


    可以了 应该是跳出去了,谢谢
作者: jzy8158    时间: 2021-7-20 14:19

回复 6# idwma
你好如果要求变了,需要执行效率高一点
(1) :02000004800971包括后面的7行全部截取出来,放到另外一个hex文件A中,因为原文有几万行,这个精简了一下
(2)完成任务后,立即跳出for循环,因为有几万行,不跳出来,循环一遍时间比较长
(3)在新的hex文件A末尾加上 :00000001FF
(4)8行内容截取出来后,剩下的行数组成新的B文件
作者: qixiaobin0715    时间: 2021-7-20 14:41

回复 8# jzy8158
批处理执行方式不是你想象的那样。
作者: idwma    时间: 2021-7-20 15:35

回复 8# jzy8158


@echo off&setlocal EnableDelayedExpansion
set out=b.txt
set outt=c.txt
(for /f %%a in (a.txt) do (
set/a n+=1
if %%a equ :02000004800971 set/a nn=!n!+8
if !n! lss !nn! (echo;%%a>>!out!) else if !n! equ !nn! (echo;:00000001FF>>!out! &echo %%a) else echo %%a
))>!outt!
pause
作者: qixiaobin0715    时间: 2021-7-20 16:56

回复 8# jzy8158
  1. @echo off
  2. set n=0
  3. setlocal enabledelayedexpansion
  4. (for /f "delims=" %%i in (a.hex) do (
  5.     if "%%i"==":02000004800971" set n=1
  6.     if !n!==0 (
  7.         echo,%%i
  8.     ) else (
  9.         set "str!n!=%%i"
  10.         set /a n+=1
  11.         if !n!==9 set n=0
  12.     )
  13. ))>B.hex
  14. (for /l %%a in (1,1,8) do echo,!str%%a!
  15. echo,:00000001FF
  16. )>new-A.hex
  17. pause
复制代码
刚才有点小问题,已修改。
作者: jzy8158    时间: 2021-7-21 15:47

回复 10# idwma


运行了一下,应该没问题,谢谢
作者: jzy8158    时间: 2021-7-21 15:48

回复 11# qixiaobin0715


    试了一下,完全OK,谢谢了




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2