Board logo

标题: [文本处理] [已解决]大神帮忙做个批处理替换前十五行指定字符串 [打印本页]

作者: andywf    时间: 2022-6-12 18:06     标题: [已解决]大神帮忙做个批处理替换前十五行指定字符串

我有多个后缀为NC的文本,想把H01改成H00(只存在前十五行)并把以原文本名字输出,我自己做的是查找全文再替换H01,查找速度度慢,想大佬们帮帮忙
作者: LJY4.0    时间: 2022-6-12 18:51

第三方:sed.exe
下载链接:http://bcn.bathome.net/tool/4.8/sed.exe
  1. @echo off
  2. for /f 'delims=" %%a in ('dir /s/b/a-d *.NC') do (
  3. sed -i s/H01/H00/g %%a
  4. )
复制代码

作者: andywf    时间: 2022-6-12 19:00

回复 2# LJY4.0


    这样是替换全部吗?我只想限定于(前十五行),谢谢你了
作者: andywf    时间: 2022-6-12 19:06

@echo off
for /f "delims=" %%i in ('dir /s/b *.NC') do (
for /f "delims=" %%a in ('type "%%~fi"') do (
set "foo=%%a"
call,set foo=%%foo:H01=H00%%
call,echo/%%foo%%>>"%%~fi._"
)
move "%%~fi._" "%%~fi"
)
exit

这样会搜索全文再替换,我只想限于前面15行内搜索,能否加个限制条件
作者: Batcher    时间: 2022-6-12 19:10

回复 3# andywf


2楼代码第3行改成这样试试
  1. sed -i "1,15s/H01/H00/g" "%%a"
复制代码

作者: Batcher    时间: 2022-6-12 19:16

回复 4# andywf
  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%i in ('dir /b /s /a-d *.NC') do (
  5.     set "n=0"
  6.     (for /f "delims=" %%a in ('type "%%i"') do (
  7.         set /a n+=1
  8.         if !n! leq 15 (
  9.             set "foo=%%a"
  10.             set "foo=!foo:H01=H00!"
  11.             echo,!foo!
  12.         )
  13.     ))>"%%~fi._"
  14.     move "%%~fi._" "%%~fi"
  15. )
复制代码

作者: andywf    时间: 2022-6-12 19:19

回复 6# Batcher


    感谢大佬
作者: andywf    时间: 2022-6-12 19:25

回复 6# Batcher


    谢谢大佬,但是会把15行后面的内容删除
作者: LJY4.0    时间: 2022-6-12 19:58

本帖最后由 LJY4.0 于 2022-6-12 20:02 编辑
  1.     @echo off
  2.     cd /d "%~dp0"
  3.     setlocal enabledelayedexpansion
  4.     for /f "delims=" %%i in ('dir /b /s /a-d *.NC') do (
  5.         set "n=0"
  6.         (for /f "delims=" %%a in ('type "%%i"') do (
  7.             set /a n+=1
  8.             if !n! leq 15 (
  9.                 set "foo=%%a"
  10.                 set "foo=!foo:H01=H00!"
  11.                 echo,!foo!
  12.             )
  13.         ))>"%%~fi._"
  14.        more +15 %%i>>%%~fi._
  15.         move "%%~fi._" "%%~fi"
  16.     )
复制代码
回复 8# andywf
作者: andywf    时间: 2022-6-12 20:41

回复 9# LJY4.0


    谢谢大佬,试了下,会把全部内容删除😂
作者: flashercs    时间: 2022-6-12 21:15

  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%i in ('dir /b /s /a-d *.NC') do (
  5.     set "n=0"
  6.     (for /f "delims=" %%a in ('type "%%i"') do (
  7.         set /a n+=1
  8.         if !n! leq 15 (
  9.             set "foo=%%a"
  10.             set "foo=!foo:H01=H00!"
  11.             echo,!foo!
  12.         ) else echo,%%a
  13.     ))>"%%~fi._"
  14.     move "%%~fi._" "%%~fi"
  15. )
复制代码

作者: andywf    时间: 2022-6-12 22:52

回复 11# flashercs


    十分感谢大神的付出,能否再加多删除几行的命令M204 H1 D1,M24,M26,G43 H1,这几行是独立成行,命令是先删除这几行(存在前十五行内),然后再替换H01成H00(也是前15行内),以原来文件名输出
作者: andywf    时间: 2022-6-12 23:03

本帖最后由 andywf 于 2022-6-12 23:13 编辑

@echo off
setlocal enabledelayedexpansion
set "v1=M204 H1 D1"
set "v2=G43 H1"
set "v3=M24"
set "v4=M26"
for %%a in (*.ptp) do (
findstr /i /v /c:"!v1!" "%%~a">new.tmp
findstr /i /v /c:"!v2!" new.tmp>"%%~a"
findstr /i /v /c:"!v3!" "%%~a">new.tmp
findstr /i /v /c:"!v4!" new.tmp>"%%~a"
del new.tmp)
这样的代码批处理很快,然后再加上替换HO1成H00(限于前十五行)
作者: andywf    时间: 2022-6-12 23:36

回复 11# flashercs


    大神,因为有些文件比大大,替换速度很慢,有没有什么办法优化
作者: qixiaobin0715    时间: 2022-6-13 08:24

最好能在网盘上发几个大文件,有利于代码测试,看看能否有人帮你优化。
作者: qixiaobin0715    时间: 2022-6-13 09:17

修改11楼第6行代码不知是否可提高一点速度:
  1.     (for /f "usebackq delims=" %%a in ("%%i") do (
复制代码

作者: andywf    时间: 2022-6-13 13:02

回复 16# qixiaobin0715


    会把全部内容删除
作者: andywf    时间: 2022-6-13 13:09

回复 16# qixiaobin0715


    文件有几万行,只想删除前面的M204 H1 D1,把 H01替换成H00


「1.NC」https://www.aliyundrive.com/s/gYZG4gr6NW2
这只是其中一个文件
作者: flashercs    时间: 2022-6-13 15:36

  1. @echo off
  2. cd /d "%~dp0"
  3. sed.exe -i -E -e "1,15{/^(M204 H1 D1|M24|M26|G43 H1)\r?$/d;s/H01/H00/g;}" *.nc
  4. pause
复制代码
论坛下载sed.exe
作者: andywf    时间: 2022-6-13 20:40

回复 19# flashercs


    成了,谢谢,牛逼克拉斯
作者: andywf    时间: 2022-6-13 21:17

回复 19# flashercs


    如果存在两种后缀文件,怎么修改呢?例如有后缀是NC ,和PTP,修改内容不变,谢谢
作者: flashercs    时间: 2022-6-13 21:35

回复 21# andywf
  1. @echo off
  2. cd /d "%~dp0"
  3. sed.exe -i -E -e "1,15{/^(M204 H1 D1|M24|M26|G43 H1)\r?$/d;s/H01/H00/g;}" *.nc *.ptp
  4. pause
复制代码

作者: andywf    时间: 2022-6-16 03:14

回复 22# flashercs


    谢谢,已经完美了,我把它转成exe并使用了




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