标题: 【出题】批处理替换文本中的连续空格 [打印本页]
作者: 随风 时间: 2009-9-23 06:07 标题: 【出题】批处理替换文本中的连续空格
替换文本中的连续空格
a.txt中有连续的空格,数量不确定,但最多不会超过100个
现要求将所有连续空格替换成一个空格,问如何才能用最少的替换次数达到要求?
比如先替换4个为1个,再替换3个为1个..... 还是先替换2个为1个,再替换3个为1个...
好像这成了一个数学题目,呵呵.....
.
完整题目是这样,有兴趣的可以练练手
a.txt中有连续空格,连续空行,有只有空格(包括全角的)的空行(视为空行)
要求是
合并连续空行,连续空格,去除首尾空格(包括全角的)
只有空格(包括全角的)的行也算空行.
忽略以abc或123或456开头的行,注意:前面有空格的也要忽略. 比如 空格abc
文本中含有\和/符号,无其它特殊字符.
作者: Lumiere 时间: 2009-9-23 10:21
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=*" %%a in (1.txt) do (
- set "str=%%a"
- if not "!str:~0,3!"=="123" (if not "!str:~0,3!"=="456" (if not "!str:~0,3!"=="abc" echo %%a>>2.txt)))
- for /f "tokens=1* delims= " %%a in (2.txt) do set "head=%%a"&set "tail=%%b"&call :lp "%%b"
- pause&exit
- :lp
- for /f "tokens=1* delims= " %%i in ("!tail!") do (
- set "head=!head! %%i"&set "tail=%%j"
- if not "!tail!"=="" (goto lp) else echo !head!>>final.txt
- )
复制代码
作者: terse 时间: 2009-9-23 14:46
处理大文件还是效率有问题- @echo off&setlocal enabledelayedexpansion
- for %%i in (abc 123 456) do set _%%i=i
- for /f "tokens=2 delims=:" %%i in ('findstr /n .* "1.txt"') do (
- set "str="
- for %%a in (%%i) do if defined str (set str=!str! %%a)else set str=%%a
- if defined str (
- for %%a in ("!str:~,3!") do if not defined _%%~a echo !str!&set k=
- ) else if not defined k echo;&set "k=k"
- )
- pause
复制代码
作者: Batcher 时间: 2009-9-23 14:49 标题: 围观
复制代码
作者: Lumiere 时间: 2009-9-23 14:52 标题: 回复 4楼 的帖子
晕死,第三方好简单啊……
作者: keen 时间: 2009-9-23 17:39 标题: 回复 1楼 的帖子
希望 随风兄 给个例子。
作者: netbenton 时间: 2009-9-23 21:12
- @echo off&setlocal enabledelayedexpansion
- (for /f "tokens=*" %%a in (a.txt) do (
- set str=%%a
- for %%b in (abc 123 456) do (if "!str:~,3!" equ "%%b" set str=)
- set res=
- for %%b in (!str!) do set res=!res! %%b
- if defined res echo !res:~1!
- ))>a_2.txt
复制代码
作者: 随风 时间: 2009-9-24 04:55
第三方用的好就是让人羡慕啊!
不过大家都把不连续的空行删除了,难道是我没说清楚?
作者: terse 时间: 2009-9-24 10:14
我上面应该是保留一行的啊
作者: 随风 时间: 2009-9-24 12:21 标题: 回复 9楼 的帖子
你没测试的吧.^_^
作者: terse 时间: 2009-9-24 14:13
对于 忽略以abc或123或456开头的行 是直接删除呢 还是不处理连续空格但不删除呢- @echo off&setlocal enabledelayedexpansion
- for %%i in (abc 123 456) do set _%%i=i
- for /f "tokens=1* delims=:" %%i in ('findstr /n .* "1.txt"') do (
- set str=
- for %%a in (%%j) do if defined str (set str=!str! %%a) else set str=%%a
- if defined str (
- for %%a in ("!str:~,3!") do if not defined _%%~a (echo !str!)else echo %%j
- set "k="
- ) else if not defined k echo;&set "k=k"
- )
- pause
复制代码
[ 本帖最后由 terse 于 2009-9-24 14:14 编辑 ]
作者: 523066680 时间: 2009-9-24 15:26 标题: 我做连续空格的
不管有没有,
1。把所有 的两个空格" " 替换成 "我是两个空格"
2。大于2又是奇数,咋整?后面一定有1个空格没化,先把 "我是两个空格"+1个空格 干掉
3。剩下的如果有,就全都是"我是两个空格了",全刷。
这样操作用数字表示:
1。如果除2余1 干掉对应的那个1
2。可以除2的都干掉
独立的那个1 我可没碰。
[ 本帖最后由 523066680 于 2009-9-24 19:01 编辑 ]
作者: 523066680 时间: 2009-9-24 15:29
- @echo off
- set "str=12 123 456 789"
- set "str=%str: =我是两个空格%"
- set "str=%str:我是两个空格 =%"
- echo,%str:我是两个空格=%
- pause
复制代码
至于大于2的连续空格有多少个,就不用管了。
用第三方,人家第三方的编写里面也要一段代码呀,现在做的代码弄成函数不是也可以实现一句话搞定么?
我以为,应以当前方便为主。
如果第三方已经存在了,当然用第三方方便了,第三方字符处理也好一些~
话说还有vbs…… (请原谅我用以上描述性的语言赚回帖分……)
------IF_EXIST
[ 本帖最后由 523066680 于 2009-9-24 18:53 编辑 ]
作者: 523066680 时间: 2009-9-24 18:48
回头看了一下,表情愣然:
原来要求不止于此,我太天真了。
[ 本帖最后由 523066680 于 2009-9-24 18:49 编辑 ]
作者: netbenton 时间: 2009-9-24 19:42
这次应该全部合楼主的题意了吧!
- @echo off&setlocal enabledelayedexpansion
- (for /f "tokens=*" %%a in ('findstr /n .* a.txt') do (
- set abc=%%a
- set str=!abc:*:=!
- if not defined str set kon=y
- for /f "tokens=* delims= " %%b in ("!str!") do (set str=%%b
- for %%c in (abc 123 456) do (if "!str:~,3!" equ "%%c" set str=)
- if defined str (
- set res=
- for %%c in (!str!) do set res=!res! %%c
- if defined res (
- if defined kon echo;
- echo;!res:~1!
- set kon=
- )
- ) else (
- if "%%b" equ "" (set kon=y) else (
- if defined kon echo;
- echo;!abc:*:=!
- set kon=
- )
- )
- )
- ))>a_2.txt
- start a_2.txt
复制代码
作者: netbenton 时间: 2009-9-24 19:47
一、空格归一变量函数:
set "space_one=set @=!@: ="_" !&set @=!@: "_"=!&set @=!@:"_"=!"
用法:
(%space_one=变量名%)
二、空格归一并丢掉首尾空格变量函数:
set "space_one_cut=set @= !@: ="_" !"_"&set @=!@: "_"=!&set @=!@:"_"=!&set @=!@:~1!"
用法:
(%space_one_cut:@=变量名%)
[ 本帖最后由 netbenton 于 2009-9-24 20:17 编辑 ]
作者: 随风 时间: 2009-9-24 20:37
思路妙极了
作者: 随风 时间: 2009-9-24 20:51 标题: 回复 11楼 的帖子
忽略以abc或123或456开头的行 就是直接删除
作者: 523066680 时间: 2009-9-24 21:02
哇 积分真的没我的份……
我去我博儿独自玩了
作者: 523066680 时间: 2009-9-24 21:17
o~ 有for可以处理了耶,所以没我份了。我去吃自己了。
作者: caruko 时间: 2010-4-16 11:56
多个空行变1行的话,可以
more /s a.txt >_a.txt
作者: yashuer 时间: 2012-11-16 15:44
感觉这里的人喜欢用批处理做文本解析。但是相对而言,批处理的强项不在这里。
做文本解析的。个人认为sed ,awk ,m4 等更强大点。
有的应用可以去gnu32网站上下载 coreutils 等 unix 工具来完成的
作者: 522235677 时间: 2013-1-5 10:02
都是高手啊
作者: 1e3e 时间: 2014-1-22 14:51
已知:
a县项目汇总.txt内容如下:
weewewe wwww sdsdsdssd eeeeee
eweweweewe dsdsd wewewew dsdsd
sdsdsdsdsd sdsdsd sdsdsdsd dsdsdsdsads
sdadadaerer dsadfafa ffasdfasdf da**sfasf
dadfasf sadfafasf a**fafasf fafasfdsafsaf
**fasfsafsafd fafasfasfsafsaf fasfasfasfasf
**f胗 fafasfasfeweewf fasfarrf
现在按照其空白顺序(如图所示)依次在行尾加上使其内容如下:
weewewe wwww sdsdsdssd eeeeee 项目规划地1部分
eweweweewe dsdsd wewewew dsdsd 项目规划地1部分
sdsdsdsdsd sdsdsd sdsdsdsd dsdsdsdsads 项目规划地2部分
sdadadaerer dsadfafa ffasdfasdf da**sfasf 项目规划地2部分
dadfasf sadfafasf a**fafasf fafasfdsafsaf 项目规划地3部分
**fasfsafsafd fafasfasfsafsaf fasfasfasfasf 项目规划地3部分
**f胗 fafasfasfeweewf fasfarrf 项目规划地3部分
说明:地1部分我没有打成“第1部分”,是因为处理文本的需要选择了“地”而非“第”
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |