标题: [文本处理] 批处理字串取代出现了程式码 [打印本页]
作者: Topgunguy 时间: 2012-7-15 22:42 标题: 批处理字串取代出现了程式码
各位版友大家好,我想请教一下字串取代的问题。
我在做字串取代时,取代的字串会变成下一行程式码的内容,请问为什麽会这样呢?
/G05.1 Q1本来应该空白,但变成了.M09=.- @echo off
- (for /f "tokens=1* delims=:" %%i in ('findstr /n .* %1') do (
- set "line=%%j"
- setlocal enabledelayedexpansion
- if "!line!"=="" (echo.!line!) else (
- set "line=!line:/G05.1 Q1=!"
- set "line=!line:.M09=.!"
- set "line=!line:/G05.1 Q0=!"
- echo.!line!
- endlocal
- )))>back.txt
复制代码
以下是%1的内容- %
- O0100
- (SC POSTPROCESSOR A.I.C TAICHUNG)
- G40G49G90G80
- G17G00G54X0.Y0.
- /G05.1 Q1
- (TOOL: *4.0)
- M03S2000
- G43Z50.H1
- M8
- G98G81X-12.Y0.Z-1.R1.F60.M09
- X12.S2000M03
- G80Z50.
- /G05.1 Q0
- M09
- G00Z50.
- X0.Y0.
- M05
- M30
- %
复制代码
执行後会变成第六行有问题- %
- O0100
- (SC POSTPROCESSOR A.I.C TAICHUNG)
- G40G49G90G80
- G17G00G54X0.Y0.
- .M09=.
- (TOOL: *4.0)
- M03S2000
- G43Z50.H1
- M8
- G98G81X-12.Y0.Z-1.R1.F60.
- X12.S2000M03
- G80Z50.
-
- M09
- G00Z50.
- X0.Y0.
- M05
- M30
- %
复制代码
而我想要的是- %
- O0100
- (SC POSTPROCESSOR A.I.C TAICHUNG)
- G40G49G90G80
- G17G00G54X0.Y0.
- (TOOL: *4.0)
- M03S2000
- G43Z50.H1
- M8
- G98G81X-12.Y0.Z-1.R1.F60.
- X12.S2000M03
- G80Z50.
- M09
- G00Z50.
- X0.Y0.
- M05
- M30
- %
复制代码
作者: CrLf 时间: 2012-7-15 22:56
本帖最后由 CrLf 于 2012-7-19 11:51 编辑
因为第六行执行了 set "line=!line:/G05.1 Q1=!" 之后,变量 line 为空。
如果是我可能会这样解决:
set "line=%%j" 改成 set "line=#%%j"
echo.!line! 改成 echo.!line:~1!
顺便说下,echo. 会触发文件搜索,所以效率相对比较低,建议使用 echo: 代替,具有最好的效率和最强的兼容性
作者: Topgunguy 时间: 2012-7-15 23:12
感谢版大的回答,我在%%j前面多加了#,
原本该消失的就消失了,
但每行最前面都多了一个#。
作者: CrLf 时间: 2012-7-16 10:50
回复 3# Topgunguy
2楼不是还有一句与 set 对应的针对 echo 的修改吗?
作者: Topgunguy 时间: 2012-7-17 22:26
本帖最后由 Topgunguy 于 2012-7-17 22:33 编辑
感谢版大,我看懂了。
後来我发现
set "line=!line:/G05.1 Q1=!" 改成
set "line=!line:/G05.1 Q1= !" 似乎也可以不为空
我想另外再请教一下,取代字串一定要像这样一行一行写进去吗?
档案超过300kb时会非常久,而整个文本会改到的最多也不过十行啊>_<
不知有没有其他直接取代的指令
感谢~
作者: CrLf 时间: 2012-7-18 11:24
本帖最后由 CrLf 于 2012-7-18 11:32 编辑
回复 5# Topgunguy
纯批可以考虑如此简化:- @echo off
- (for /f "delims="eol^= %%a in ('findstr /x /v /r /c:"/G05.1 Q[01]" "%~1"') do (
- if "%%a"==".M09=." (echo .=.) else echo\%%a
- ))>bak.txt
复制代码
若能使用第三方,sed 则更快更方便:- sed "/^G05.1 Q[01]$/d;s/^M09/./" "%~1">bak.txt
复制代码
vbs 效率应该也不错:- Set FSO = CreateObject("Scripting.FileSystemObject")
-
- Set ts = FSO.OpenTextFile(WScript.Arguments(0),1)
- str = ts.ReadAll
- ts.Close
-
- str = Replace(str,"G05.1 Q0","")
- str = Replace(str,"G05.1 Q1","")
- str = Replace(str,"M09",".")
-
- Set ts = FSO.CreateTextFile(bak.txt,True)
- ts.Write str
- ts.Close
复制代码
作者: Topgunguy 时间: 2012-10-2 20:36
感谢Cr大的解答,
有一个很重要的问题我一直想问,
一开始我直觉这应该很基本,爬文google一下也许马上就会知道,
於是就一直没问,断断续续自已找答案,
但两个月过去後,我错了,我还是不知道。
我应该马上就问才对Orz。
请问VBS版的代码要怎麽使用?
保存成 .vbs 後直接点两下,会显示
行3 字元5 阵列索引超出范围
(大写S↑)
如果是将档案放到 .vbs上放开,则显示
行11 字元5 此处须要物件bak
(大写S↑)
难道还要用VB编译吗?
感谢~
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |