中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: [求助]增加换行符的问题 上一主题 | 下一主题
hgx126
初级用户





积分 100
发帖 80
注册 2008-9-12
状态 离线
『楼 主』:  [求助]增加换行符的问题

有多个文本文件,内容类似,其中一个a.txt如下:
1.abc.de
2、efg;.hijk
3.lmn;opq
4rst.uvw
xyz1.23
ghilk45、234
我现在要将以上文本中以数字开头,紧接着是逗号或顿号的段落前增加一个换行符,如果数字后跟着的是逗号则换成顿号。如将上文转换后的结果如下:
1、abc.de

2、efg;.hijk

3、lmn;opq
4rst.uvw
xyz1.23
ghilk45、234
我写了如下P处理,
setlocal enabledelayedexpansion
for /f "tokens=1,* delims=、." %%a in (a.txt) do (
set a=%%a
set b=%%b
echo !a!|findstr "^[0-9]*$">nul && echo.>>b.txt
echo !a!、!b!>>b.txt
)
可是它将4rst.uvw和xyz1.23中的逗号也替换成了顿号。请大家完善一下,如何避免这种情况。

2010-3-25 23:12
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 2 楼』:  


@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (set i=%%i&set j=!i:~1,1!&set j=!j:.=、!
echo %%i|findstr "^[0-9].*">nul
if !ERRORLEVEL!==0 (if "!j!"=="、" (echo.&echo !i:~0,1!!j!!i:~2!) else echo %%i) else echo %%i)>>b.txt
[ Last edited by Hanyeguxing on 2010-3-26 at 00:31 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-3-25 23:51
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 3 楼』:  



  Quote:
Originally posted by hgx126 at 2010-3-25 23:12:
可是它将4rst.uvw和xyz1.23中的逗号也替换成了顿号。请大家完善一下,如何避免这种情况。

因为 "delims=、." 是全文本内进行分隔的。
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (
        set i=%%i
        set j=!i:~1,1!
        set j=!j:.=、!
        echo !i:~0,1!|findstr "[0-9]">nul
        if !ERRORLEVEL!==0 (
                if "!j!"=="、" (
                        echo.
                        echo !i:~0,1!!j!!i:~2!
                ) else echo %%i
        ) else echo %%i
)>>b.txt
for /f "delims=" %%i in (a.txt) do i解析文本,不以任何字符为分隔符号
set i=%%将每行赋值给变量i
set j=!i:~1,1!和set j=!j:.=、!获取第二个字符,将.和、都替换成、
echo !i:~0,1!|findstr "[0-9]">nul检查行首第一个字符是否为数字,是则返回0,不是则返回1
if !ERRORLEVEL!==0 ...... else echo %%i检查返回代码,是则...否则原样输出
if "!j!"=="、" ...... else echo %%i如果第二个字符是、则...否则原样输出
echo.&echo !i:~0,1!!j!!i:~2!指定输出效果

[ Last edited by Hanyeguxing on 2010-3-26 at 00:58 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-3-25 23:57
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
hgx126
初级用户





积分 100
发帖 80
注册 2008-9-12
状态 离线
『第 4 楼』:  

感谢兄弟们。可是当数字大于9时,就不能增加换行符呢?还请你们帮忙哈。

2010-3-29 12:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qinchun36
高级用户

据说是李先生


积分 609
发帖 400
注册 2008-4-23
状态 离线
『第 5 楼』:  

那就换种脚本吧:
var fso = WScript.CreateObject("Scripting.FileSystemObject");
var newText = "", temp;
var f = fso.OpenTextFile("a.txt", 1);
while(!f.AtEndOfStream) {
        temp = f.ReadLine();
        if(/^\d+[\.|、].*$/.test(temp)) {
                temp = temp.replace(/^(\d+)[\.|、](.*)$/,"$1、$2");
                newText += "\r\n";
        }
        newText += "\r\n" + temp;
}
fso.CreateTextFile("b.txt", true, false).Write(newText);




┏━━━━━━┓
┃据说是李先生┃
┠──────┨
┃*ntRSS┃
┗━━━━━━┛
2010-3-29 13:27
查看资料  发送邮件  发短消息 网志  OICQ (182484135)  编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 6 楼』:  


@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do call :x "%%i"
goto :eof
:x
set "i=%~1"&set n=0
:y
echo !i:~%n%,1!|findstr "[0-9]">nul
if !ERRORLEVEL!==0 set/a n+=1&goto y
set/a m=%n%+1
(if not %n%==0 (set "j=!i:~%n%,1!"&set "j=!j:.=、!"&if "!j!"=="、" (echo.&echo !i:~0,%n%!、!i:~%m%!) else echo.!i!) else echo.!i!)>>b.txt
[ Last edited by Hanyeguxing on 2010-3-29 at 17:42 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-3-29 15:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
hgx126
初级用户





积分 100
发帖 80
注册 2008-9-12
状态 离线
『第 7 楼』:  

6楼的怎么把大于4以后的段落全部去掉了呢?

2010-3-29 16:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by hgx126 at 2010-3-29 16:26:
6楼的怎么把大于4以后的段落全部去掉了呢?

它本身是不会把4以后的段落去掉的,你看哪部分代码有如此功能呢?
但需要说明的是,3楼和6楼的代码都没有对敏感字符的问题进行处理。
以3楼的代码为例:
例如文本的某行内容为:
123&echo 456
处理后将显示
123
456
再比如,文本的某行内容为:
123&exit
那么处理到此行后,批处理将直接终止并退出。

虽然6楼的代码修改后能够解决这个问题,但如果某行文本的内容是:
%i%
或是
!j!
那么
在echo这内容时,如果批处理可以替换该变量,则直接替换,否则显示空。。。
所以,如果文本中含有敏感字符,最好用5楼的vbs进行处理

[ Last edited by Hanyeguxing on 2010-3-29 at 17:48 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-3-29 16:37
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: