中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 出题:整理文本 (新手老鸟都来试试)
« [1] [2] [3] [4] »
作者:
标题: 出题:整理文本 (新手老鸟都来试试) 上一主题 | 下一主题
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 31 楼』:  


change a.txt /from "&H0D0A" /to null
change a.txt /from "。" /to "。&H0D0A0D0A"
change.exe
http://upload.cn-dos.net/img/427.zip

[ Last edited by HAT on 2008-10-29 at 14:19 ]



2008-7-14 16:27
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 32 楼』:  

31 楼思路也是先把a.txt拼接成一行,再替换。
测试同样不行,刚下了个change 试了试,
问一个问题:  在change 中怎么表示不包括某字符的行?



致精致简!
2008-7-14 17:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 33 楼』:  

看样子没什么问题嘛,如何不行?
change不是sed
没有那么多的正则标记
至于不包含指定字符的行
是有一个/v的开关
类似find

[ Last edited by qzwqzw on 2008-7-14 at 05:41 PM ]

2008-7-14 17:34
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 34 楼』:  

哦,明白了

你没有注意到change是for dos的程序吗?

在win32 console cmd下运行要先初始化中文环境的

chcp 437>nul & graftabl 936>nul

2008-7-14 17:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 35 楼』:  



  Quote:
Originally posted by qzwqzw at 2008-7-14 17:39:
哦,明白了

你没有注意到change是for dos的程序吗?

在win32 console cmd下运行要先初始化中文环境的

chcp 437>nul & graftabl 936>nul

确实是这个问题,谢谢!
不过我还是想问一下  在change 中怎么表示不包括某字符的行?
我的思路是 先将所有句号都替换成回车、再删除所有不包含句号的行的回车



致精致简!
2008-7-14 17:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 36 楼』:  

哪里有 change。exe 的教程吗? 帮助信息是英文的我一个都看懂啊!。。。



致精致简!
2008-7-14 17:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 37 楼』:  

我这里有一部分中文帮助,不全。

  Quote:
CHANGE.EXE 是一个以命令行方式处理对文件的修改工具,目标文件可以是任意大小任意格式。可以一次执行30条命令!非常地高效。

一、基本格式:
change 源文件.txt /from “被替换的串” /to “替换串” /in “条件”

二、已知限制是它不支持长名,可能不认识一些windows下的特殊字符作文件名。对此,解决之道是以短文件名访问(例如:myfile~1.txt)。

三、详细功能列表:
⒈處理的文件不限大小,前提是磁盤上至少要有与目标文件等大的预留空间,用于临时存放其副本;
⒉不仅处理文本文件,也处理二进制文件;
⒊替入和换出的字符串长度可以不同;
⒋可以指定替换行为只在特定行发生,特定行的标志是有另一个指定的字符(串)出现,这个字符串还允许大小写敏感;
⒌可以同时执行多达30个修改指令;
⒍支持子目录;
⒎兼容dos/Unix/Mac 文本格式;
⒏输入输出字符串可以是文本的(Ascii),也可以是十六进制值或十进制值;
⒐替换速的特快;
⒑具有备份选项,以防源文件可能损坏;
⒒替换工作可以交互式进行(控制台);
⒓除命令行、控制台它还允许把多条指令组合编制为一个控制文件一次执行;
⒔可以使用布尔变量;
⒕源文件名支持通配符;
⒖"*"用在指定的被修改字符串时,表示由当前位置到行尾的整个子串;
⒗在指定目标字符串时,可以设定“列”,仅当字符位于此范围内时才发生替换;
⒘可以按文件属性排除某个文件不被处理;
⒙可以排除某些行不处理;
⒚按ESC可以中止处理进程。

四、如何指定参数
        当程序运行时,它将以如下三种方式读取参数:
        ⒈INI文件
        ⒉系统环境变量
        ⒊命令行
        先看最常用的命令行语法。
To/From/In规范:
FROM        被替换的文字
TO        用于替换的文字
TO        (可选)指定发生替换行为的特定行标志
举例,设test.txt文件包含如下两行:
The quick brown fox jumped over
the lazy brown dog.

我们输入:
change /from brown /to red /fox
则文件变为:
The quick red fox jumped over
the lazy brown dog.
即:有出现"fox"的那行"brown:被替换为"red",其它行不变。

如果所指定字符串包含空格或其他特殊字符,请用双引号,比如:
CHANGE test.TXT /FROM "my music" /TO "my video"

或者用十六进制字符处理特殊字符,如:
CHANGE test.TXT /FROM &H0D0A0D0A /TO &H0D0A
(删除多余的行)

设定列宽的例子:
change test.txt /from ok 5/10 /to no
只替换从第5列到第10列的ok 为 no,这个功能是按首字符认定位置的,比如有一个“ok”位于4,5列那么它不会被替换。

仅删除的例子:
change test.txt /from no /to null
(即:删除所有的no)

如果要忽略英文字母的大小写,使用参数 /I

与DOS类似,可以用参数 /s 处理所有子目录中文件的替换工作

替换指定行的例子:
change test.txt /from no /to re /lines 3-8 30-50
(即:只替换3到8行和30到50行的字符)

出于安全目的,该程序总要自动生成一个临时文件备份源文件,如果用 /N文件名 参数另指定一个输出文件,则没有临时文件输出。

要消除文件末尾多余的空格,可以用参数 /trim

使用布尔变量的例子:
CHANGE TEST.TXT /FROM Apple /TO Banana /IN (red OR brown) AND NOT Pear
将替换apple为banana,但所在行必须有red或brown出现,并且没有Pear出现

本程序的返回误码意义:
0        无错,有修改
1        无错,无修改
253        提前中止
254        内部错误
255        语法错





2008-7-14 18:04
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 38 楼』:  

//不过我还是想问一下  在change 中怎么表示不包括某字符的行?

/V says to find those items that do NOT match the specification;



2008-7-14 18:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 39 楼』:  

谢谢我得到的中文帮助信息也是这些,讲的太少了。
change a.txt /from "&H0D0A" /to "yyy&H0D0A"  /in 。
我的本意是将包含句号的行的回车替换为yyy加回车,但是怎么没有句号的行末尾也加上了yyy ???



致精致简!
2008-7-14 18:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 40 楼』:  

确实是这个问题,谢谢!
不过我还是想问一下  在change 中怎么表示不包括某字符的行?
我的思路是 先将所有句号都替换成回车、再删除所有不包含句号的行的回车
--------------------
真是较真的厉害
既然已经有了合适的方案
何必要舍易求难?

change有两种工作模式
一种是binary(block)模式
也就是我提到全文文本替换
按块读取字节然后进行替换
对0d0a视同普通字节

另一种是text(record)模式
也就是我说过的行缓冲模式
按行读取文本然后进行替换
对0d0a会作特殊处理

而如果/from /to /in中使用&H十六进制表示的字符
则直接进入binary模式
而/in开关则需要text模式的支持
所以你的替换操作是无效的

下面的命令是个示例
change \test\a.txt /n\test\b.txt /from "文件" /to "file" /in not "File"

2008-7-14 19:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 41 楼』:  

多谢多谢,又有不少收获。。。。 ^_^



致精致简!
2008-7-14 19:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 42 楼』:  

qzwqzw 的讲解真是详细啊^_^



2008-7-14 19:34
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 43 楼』:  

真是郁闷,qzwqzw 兄的示列代码我这么运行不了?
我测试代码如下: xp sp2
:
@echo off
chcp 437>nul & graftabl 936>nul
change \test\a.txt /n \test\c.txt /from "一" /to " yyy " /in not "。"
对这段代码的理解为:
   运行test模式、即按行读取。不产生临时文件,新文件在c.txt 中,
   替换不含句号的行中的“一”为 “ yyy ”
怎么就是运行不了呢?



致精致简!
2008-7-14 23:25
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 44 楼』:  

晕!
test是我自己的示例文本文件的相对路径
并非模式

/n后不要跟空格

2008-7-15 00:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 45 楼』:  

看来它是定要欺负我了,我也这样测试过,还是不行
@echo off
cd.>d\c.txt
chcp 437>nul & graftabl 936>nul
change \d\a.txt /n\d\c.txt /from "一" /to " yyy " /in not "。"
[ Last edited by 26933062 on 2008-7-15 at 01:35 PM ]



致精致简!
2008-7-15 13:34
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] [4] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: