标题: [文本处理] [已解决]批处理如何添加和去除BAT代码里多个指定行前面::字符? [打印本页]
作者: wh1234567 时间: 2011-11-27 23:33 标题: [已解决]批处理如何添加和去除BAT代码里多个指定行前面::字符?
如何将BAT代码里指定的例如下面5行每行前面都添加和去除::符号并输出,保持其他代码和结构不变。
要求带有2个功能的批处理:
1.添加::符号(注意:如果判断下面几行前面都包含::符号的话则提示无需添加,也无需输出;否则需要处理并输出。)
2.取消::符号(注意:如果判断下面几行前面都不包含::符号的话则提示无需去除,也无需输出;否则需要处理并输出。)
处理或提示完毕后提示按任意键退出- echo 专业:%ip1%: (!xs1!%v1%:00 -- !m22%x1%!%v2%:00) >>"%4%.txt"
- echo 业绩:%iq3%: (!m22%x1%!%v2%:00 -- !m22%x2%!%v4%:00) >>"%4%.txt"
- echo. >>"%4%.txt"
- echo 分类 %5zr% 次 >>"%4%.txt"
- echo. >>"%4%.txt"
复制代码
作者: 545810831 时间: 2011-11-28 21:02
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=3" %%i in ('find /v /c "" 1.txt') do set /a a=%%i
- for /f "tokens=1,2 delims=:" %%i in ('findstr /n /b "::" 1.txt') do set /a b+=1
- if "!b!"=="" exit
- if "!b!"=="!a!" exit
- set /p aa=要添加::请输入y 去除::输入n:
- for /f "delims=" %%i in (1.txt) do (
- set str=%%i
- if "!aa!"=="n" (
- if "!str:~0,2!"== "::" (echo !str:~2!) else echo !str! )
- if "!aa!"=="y" (
- if not "!str:~0,2!"== "::" (echo ::!str!) else echo !str!)
- )
- pause
复制代码
作者: yyykkkyyyy 时间: 2011-11-29 00:28
本帖最后由 yyykkkyyyy 于 2011-11-29 02:03 编辑
用BAT来处理BAT,不说很难,但象二楼那样简单处理肯定是不行的。既然高手们没来,我这算抛砖引玉吧。
如果按提问里就那五行需要处理实用范围也太窄了,需要按具体文本定哪几行,按“例如”的情况
可用下面代码取得行序号 :- for /f "delims=:" %%i in ('findstr/in "echo.*>>.%%4%%\.txt" a.bat')do call set ns=%%ns% %%i
复制代码
我还是写个指定几个行序号通用性强一些,直接在代码里写定了,可以自己改成临时用set/p接收输入的- @echo off
- set fs=a.bat
- set fd=b.bat
- rem 下一行表示 加/减 :: 在第一个数前附 +/- 的行序号(空行计入序号)
- set ns=+2 3 4 6
- set "f=%ns:~,1%1"
- set "ns=%ns:~1%"
- for /f "delims=:" %%i in ('findstr/nb "::" "%fs%"')do set/a #%%i=1
- for /f "delims=:" %%i in ('findstr/nb ":::" "%fs%"')do set "##%%i=:"
- for /f "delims=:" %%i in ('findstr/nb ":" "%fs%"'
- )do if not defined #%%i set "##%%i=:"
- for %%i in (%ns%)do (
- if defined #%%i (
- if %f% lss 0 set fg=y&set/a _%%i=f)else (
- if %f% gtr 0 set fg=y&set/a _%%i=f)
- )
- if not defined fg echo 不需要更改&goto :end
- cd.>"%fd%"
- for /f "tokens=1* delims=: " %%i in ('findstr/n .* "%fs%"')do (
- if defined _%%i (>tem.yky echo.%%j&call :yky %%i)else (
- (if defined #%%i set/p=::<nul
- if defined ##%%i set/p=:<nul
- echo.%%j)>>"%fd%"))
- del tem.yky
- echo ok&goto :end
- :yky
- call set xx=%%_%1%%
- if %xx% gtr 0 (
- (set/p=::<nul
- call set/p=%%##%1%%<nul&type tem.yky)>>"%fd%"&goto :eof)
- for /f "tokens=* delims=: " %%i in (tem.yky)do (
- (call set/p=%%##%1%%<nul
- echo.%%i)>>"%fd%" &goto :eof)
- :end
- pause
复制代码
作者: wh1234567 时间: 2011-11-29 03:04
回复 3# yyykkkyyyy
大师的代码不错,但是
for /f "delims=:" %%i in ('findstr/in "echo.*>>.%%4%%\.txt" a.bat')do call set ns=%%ns% %%i
这个为什么运行没有效果呢?
就像论坛里的代码自动显示行号,咋弄呢
作者: yyykkkyyyy 时间: 2011-11-29 09:54
回复 4# wh1234567
那句单独运行当然看不出什么,只是赋给变量了。这样吧,把3楼代码的第7-8间插入下面三行,则原第4-7的作用被代替了——只适合所提供的“例如”。至于想象论坛的那样显示行号,你下载个另外的编辑器代替普通记事本就行了- set f=1&set/p f=请输入1或直接回车选择添加:: 其他为去掉::
- set ns=&if %f% neq 1 set/a f=-1
- for /f "delims=:" %%i in ('findstr/in "echo.*>.*%%4%%\.txt" "%fs%"')do call set ns=%%ns%% %%i
复制代码
作者: wh1234567 时间: 2011-11-29 17:49
回复 3# yyykkkyyyy
这个批处理是不是可以通用,添加或去除其他任意字符?,是不是需要修改哪几处?
作者: yyykkkyyyy 时间: 2011-11-29 18:57
我说的通用性好一些只是对比指定那几行内容而言, 指定某几行或许要通用一些,要知道,修改BAT文件文件有别于普通文件,而且::与标签行的首字符也同了一半,一般文本多半不会以:开头,加上或去掉::还需要判断原来是否已存在::和单: , 只能说是特别为此编写的。要加任意字符不会比这个难,但没必要在此基础上修改,何况这代码只是说可以通过也不是写得很好。
作者: wh1234567 时间: 2011-11-29 23:26
回复 7# yyykkkyyyy
大师能不能在此顺便写个通用的指定某几行前面或后面添加和去除任意字符的批处理
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |