![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-09 22:47 |
共 47,811 主题排行 / 349,897 发帖 / 今日 2 篇 / 48,255 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 出题:整理文本 (新手老鸟都来试试) |
| 可打印版本 6,470 / 54 |
| 第16楼 slore | 发表于 2008-07-13 22:10 |
| 铂金会员 发帖 2,478 积分 5,212 | |
Originally posted by 26933062 at 2008-7-13 21:59: 哦,那我也说了bat就看你show了…… vbs的就2句话我也说过了。。。如果要用vbs的话就自己把读写完成。。。 |
|
| 第17楼 lpk130 | 发表于 2008-07-13 22:11 |
| 初级用户 发帖 30 积分 80 | |
|
代码有点复杂 |
|
| 第18楼 26933062 | 发表于 2008-07-13 22:16 |
| 银牌会员 发帖 879 积分 2,268 | |
|
14楼这个思路就换的远啊?
你太厉害了。。佩服,完全不懂。 还是看看纯bat的吧。。。。 |
|
| 第19楼 26933062 | 发表于 2008-07-13 22:23 |
| 银牌会员 发帖 879 积分 2,268 | |
|
17楼的应该获满分了、可惜今天不能评分了,明天补上。
我的代码。 思路和17楼差不多。 |
|
| 第20楼 HAT | 发表于 2008-07-13 22:24 |
| 版主 发帖 5,017 积分 9,023 | |
|
虽然我看不懂14楼的代码,但我觉得并不满足楼主的要求。
从最后几行来看,应该是先把所有的0D0A(回车换行)替换为空,也就是把整个文本的内容和并成一行,再把句号替换成回车换行。这样做违背了楼主的本意。 不过代码本身还是值得我们学习,不知 qzwqzw 兄能否讲解一下? |
|
| 第21楼 qzwqzw | 发表于 2008-07-13 23:33 |
| 银牌会员 发帖 636 积分 2,343 | |
|
其实按照楼主的本意
本来使用change、sed等文本替换工具高效率、高兼容的 但不知什么原因 楼主一定要纯P的方案 只好折中了一下 使用ASCII Assembler生成一个文本替换工具 然后再用它替换源文本 至于它是否纯P 就不用讨论太多了 ------------------------------------------------------------------ 关于ASCII Assembler的细节搜索一下过去的帖子(按内容) 下面是sbs2的用法说明与源码 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Usage: sbs2.com NUMBER "STRING1" "STRING2" <infile >outfile :: :: infile and outfile must be files (to allow random access), so in :: NT/W2000/XP no pipe (program1 | sbst | program2) must be used! :: infile and outfile must not be the same file! :: :: Substitutes the NUMBER ocurrence of STRING1 in infile by :: STRING2 and writes the result to outfile :: :: You can include any character in STRING1/2 by using its :: hex value (e.g. $0d for <CR> or $1a for EOF) :: :: If NUMBER = 0 all STRING1 are substituted by STRING2 :: :: If an error is detected or nothing is substituted, erorrlevel=0 :: replace the original file only if errorlevel>=1 (=number of :: substitutions). :: :: Instead of the double quotes (") you can also use single quotes (') :: with a different meaning for string2: :: "string2" : normal substitution :: 'string2" : before substitution the output file is rewinded :: "string2' : after substitution the outputfile is closed some examples: ----------------------------------------------------- Substitutes the 2. occurrence of user by Susan ----------------------------------------------------- sbs2.com 2 "user" "Susan" <%1 >_._ if errorlevel 1 copy _._ %1 del _._ ----------------------------------------------------- Converts dos textfiles to unix textfiles ----------------------------------------------------- sbs2.com 0 "$0d" "" <%1 >_._ if errorlevel 1 copy _._ %1 del _._ ----------------------------------------------------- Converts unix textfiles to dos textfiles ----------------------------------------------------- sbs2.com 0 "$0a" "$0d$0a" <%1 >_._ if errorlevel 1 copy _._ %1 del _._ ----------------------------------------------------- echo without CRLF ----------------------------------------------------- echo set a=|sbs2.com 0 "$0d$0a" "" >_.bat ----------------------------------------------------- Remove trailing blanks from all lines ----------------------------------------------------- :start sbs2.com 0 " $0d" "$0d" <%1 >_._ if not errorlevel 1 goto ende copy _._ %1 goto start :ende del _._ ----------------------------------------------------- Remove all single CR LF (ascii text file -> WORD) ----------------------------------------------------- sbs2.com 0 "$0d$0a$0d$0a" "$0a" <%1 >_._ if errorlevel 1 copy _._ %1 sbs2.com 0 "$0d$0a" "" <%1 >_._ if errorlevel 1 copy _._ %1 sbs2.com 0 "$0a" "$0d$0a" <%1 >_._ if errorlevel 1 copy _._ %1 del _._ ----------------------------------------------------- Extract line 5-9 from a text file ----------------------------------------------------- sbs2.com 4 "$0d$0a" '" <%1 >_._ if errorlevel 1 copy _._ %1 sbs2.com 5 "$0d$0a" "$0d$0a' <%1 >_._ if errorlevel 1 copy _._ %1 ----------------------------------------------------- The source code ----------------------------------------------------- @=$100 move.w #$81,r5 movu.bw -1.b(r5.w),r2 eor.l r0,r0 eor.l r4,r4 .lab1: _10: dec.w r2 bmi.w x100 move.b (r5.w),r0 inc.w r5 cmp.b #'0',r0 blo.b _20 cmp.b #'9',r0 bhi.b _20 sub.b #'0',r0 mulsq.l #10,r4,r4 add.l r0,r4 move.w #_30,lab1 br.b _10 _20: jmp.w (lab1) _30: move.l r4,number move.w #buf1,r6 bsr.w get_string or.w r6,r6 beq.b .x100 move.w #buf2,r6 bsr.w get_string eor.l r5,r5 _a00: move.w #buf1,r6 eor.w r4,r4 _a10: move.b #$3f,m0 move.w #buf0,r1 move.w #1,r2 eor.w r3,r3 trap #$21 bcs.b .x100 or.w r0,r0 beq.b _x100 move.b buf0,r0 cmp.b (r6.w),r0 beq.b _a20 _a50: or.w r4,r4 beq.b _a30 move.w #$4201,r0 move.w #-1,r2 move.w r4,r1 neg.w r1 trap #$21 move.w #buf1,r1 move.w #1,r2 _a30: move.b #$40,m0 inc.w r3 trap #$21 bcs.b .x100 cmp.w #buf2,r1 bne.b _a60 tst.b #1,stop bne.b _x110 _a60: cmp.w r0,r2 beq.b _a00 .x100: br.b x100 _a20: inc.w r6 inc.w r4 cmp.w buf1l,r4 blo.b _a10 inc.l r5 move.l number,r0 or.l r0,r0 beq.b _a40 cmp.l r0,r5 beq.b _a40 dec.w r4 move.w #buf1,r1 move.w #1,r2 br.b _a50 _a40: tst.b #1,start beq.b _a41 move.w #$4200,r0 eor.w r1,r1 eor.w r2,r2 inc.w r3 trap #$21 move.b #$40,m0 trap #$21 dec.w r3 _a41: move.w #buf2,r1 move.w buf2l,r2 br.b _a30 _x100: or.w r4,r4 beq.b _x110 move.w #buf1,r1 move.w r4,r2 br.b _a30 _x110: move.w r5,r0 or.l r5,r5 beq.b x101 move.l number,r1 or.l r1,r1 beq.b _x120 cmp.l r5,r1 bhi.b x100 move.b #1,r0 br.b x101 _x120: cmp.l #$ff,r5 bls.b x101 move.b #-1,r0 br.b x101 x100: eor.b r0,r0 x101: move.b #$4c,m0 trap #$21 get_string: eor.w r1,r1 move.w r6,r3 move.w #_10,lab1 move.w #_30,lab2 ; move.l #(_30<<16)+_10,lab1 ; kuerzer _10: dec.w r2 bmi.b _x100 move.b (r5.w),r0 inc.w r5 eor.b m0,m0 cmp.b #'"',r0 beq.b _20 cmp.b #"'",r0 beq.b _21 jmp.w (lab1) _21: inc.b m0 _20: jmp.w (lab2) _30: move.w #_40,lab1 move.w #_50,lab2 ; move.l #(_50<<16)+_40,lab1 ; kuerzer move.b m0,start br.b _10 _40: or.b r1,r1 bne.b _41 cmp.b #'$',r0 bne.b _42 move.w #2,r1 br.b _10 _42: move.b r0,(r6.w) inc.w r6 br.b _10 _41: or.b #$20,r0 sub.b #'a'-10,r0 bpl.b _43 add.b #'a'-10-'0',r0 _43: lsl.b #4,m1 add.b m1,r0 dec.b r1 beq.b _42 move.b r0,m1 br.b _10 _50: sub.w r3,r6 move.w r6,-2.b(r3.w) move.b m0,stop rts.w _x100: addq.w #2,r7 br.b x100 lab1: dc.w .lab1 lab2: blk.w 1 even start: blk.b 1 stop: blk.b 1 number: blk.l 1 buf0: blk.w 1 buf1l: blk.w 1 buf1: blk.w 200 buf2l: blk.w 1 buf2: blk.w 200 |
|
| 第22楼 bat-zw | 发表于 2008-07-14 00:27 |
| 金牌会员 发帖 1,276 积分 3,105 | |
|
也来一个: 感觉思路和效率都还可以,所以发了:
[ Last edited by zw19750516 on 2008-7-14 at 12:28 AM ] |
|
| 第23楼 hackerscans | 发表于 2008-07-14 09:20 |
| 初级用户 发帖 51 积分 73 | |
|
小菜在这学习了。 也恭喜ZW19750516荣升金牌会员。
|
|
| 第24楼 HAT | 发表于 2008-07-14 09:31 |
| 版主 发帖 5,017 积分 9,023 | |
|
qzwqzw 兄能否写个sed版本的出来?我想学习一下。
我写的不行,管道后面的部分看起来没有起作用。 |
|
| 第25楼 lxmxn | 发表于 2008-07-14 15:03 |
| 版主 发帖 4,938 积分 11,386 | |
|
来个 sed 版的。 |
|
| 第26楼 26933062 | 发表于 2008-07-14 15:28 |
| 银牌会员 发帖 879 积分 2,268 | |
Originally posted by lxmxn at 2008-7-14 15:03: 头都想破了都没想出来, 版主能解释一下这个地址么? /。$\|^$/ 这里中间的 这个 管道是或者的意思么?那么前面的 \ 就是转义符号了? 你的代码在句号开头的行时会多显示一空行,我修改如下,不知道会在某种情况下出错吗? 另外:不用管道符号能解决吗? [ Last edited by 26933062 on 2008-7-14 at 03:29 PM ] |
|
| 第27楼 HAT | 发表于 2008-07-14 15:43 |
| 版主 发帖 5,017 积分 9,023 | |
|
斑竹高明,学习了。
不过我发现这样会在原本以句号结尾的行后面添加一个多余的空行,修改如下: |
|
| 第28楼 HAT | 发表于 2008-07-14 15:47 |
| 版主 发帖 5,017 积分 9,023 | |
|
\是转义符,|不是管道,而是“或”
/。$\|^$/!表示对不是以句号结尾的非空行执行后面的命令 |
|
| 第29楼 qzwqzw | 发表于 2008-07-14 15:53 |
| 银牌会员 发帖 636 积分 2,343 | |
|
抱歉,更正一句
实现楼主的意图最简洁、高效和通用的方案 是用change、hexc等全文文本替换工具 而非sed/awk等行缓冲形式的文本编辑工具 因为后者处理跨行问题时语法会过于晦涩 而且兼容性也不是很高 因为sed、awk的多个实现对许多非标准标记支持有很大不同 sed我了解的很少 基本上我就了解了正则表达式的那一部分 其它的没有接触 但我对:nt、{N;b nt}等类似标记的兼容性存疑 [ Last edited by qzwqzw on 2008-7-14 at 03:55 PM ] |
|
| 第30楼 lxmxn | 发表于 2008-07-14 15:53 |
| 版主 发帖 4,938 积分 11,386 | |
|
嗯,就是或的意思,其实我对sed也不精,自己乱写的一个。。。
|
|
| 上一页 1 2 3 4 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |