中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 出题:整理文本 (新手老鸟都来试试)
English/Chinese Fix Translation
作者:
标题: 出题:整理文本 (新手老鸟都来试试) 上一主题 | 下一主题
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 16 楼』:   使用 LLM 解释/回答一下

Originally posted by 26933062 at 2008-7-13 21:59:

并没有在“中”字断开,是论坛自动给它换行了。
所以我的样本中都是用空行代表换行的。这样说明白了么?



哦,那我也说了bat就看你show了……

vbs的就2句话我也说过了。。。如果要用vbs的话就自己把读写完成。。。




S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
2008-7-13 22:10
查看资料  发短消息  网志   编辑帖子  回复  引用回复
lpk130
初级用户





积分 80
发帖 30
注册 2007-4-19
状态 离线
『第 17 楼』:   使用 LLM 解释/回答一下

@echo off&setlocal enabledelayedexpansion
for /f "tokens=*" %%a in (a.txt) do (
set "string=%%a"&set "str=%%a"
if "!str:~0,1!"=="。" echo 。&echo.
call :loop
if "!str:~-1!"=="。" echo 。&echo.
)
:loop
for /f "tokens=1,* delims=。" %%i in ("!string!") do (
set string=%%j
if defined string (
set/p=%%i。<nul
echo.&echo.
goto loop
) else (
set/p=%%i<nul
)
)

代码有点复杂


   此帖被 +15 点积分         点击查看详情   
评分人:【 26933062 分数: +15  时间:2008-7-15 15:31


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





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 18 楼』:   使用 LLM 解释/回答一下

14楼这个思路就换的远啊?
你太厉害了。。佩服,完全不懂。
还是看看纯bat的吧。。。。




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





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 19 楼』:   使用 LLM 解释/回答一下

17楼的应该获满分了、可惜今天不能评分了,明天补上。
我的代码。  思路和17楼差不多。

@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do call :loop "%%i"
pause>nul
:loop
set "str=%~1"
for /f "tokens=1* delims=。" %%a in ("!var!%~1") do (
if "%%b"=="" (
if "!str:~-1!"=="。" (echo %%a。&echo.&set var=) else set "var=!var!%~1"
goto :eof
) else echo %%a。&echo.&set var=&call :loop "%%b"
)
goto :eof




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





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 20 楼』:   使用 LLM 解释/回答一下

虽然我看不懂14楼的代码,但我觉得并不满足楼主的要求。
从最后几行来看,应该是先把所有的0D0A(回车换行)替换为空,也就是把整个文本的内容和并成一行,再把句号替换成回车换行。这样做违背了楼主的本意。
不过代码本身还是值得我们学习,不知 qzwqzw 兄能否讲解一下?




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

天的白色影子


积分 2343
发帖 636
注册 2004-3-6
状态 离线
『第 21 楼』:   使用 LLM 解释/回答一下

其实按照楼主的本意
本来使用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


2008-7-13 23:33
查看资料  发短消息  网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 22 楼』:  也来一个: 使用 LLM 解释/回答一下

感觉思路和效率都还可以,所以发了:

@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (set str=%%i
if "!str:。=!" neq "!str!" call :lp
if defined str set /p=!str:。=!<nul
)
pause>nul&goto :eof
:lp
set var=%str%
if "%str:~,1%" equ "。" set /p=。<nul&echo.&echo.
set str=%str:。= %
if "%var:~-1%" neq "。" set str=%str%。
for %%i in (%str%) do (set var=%%i
if "!var:~-1!" neq "。" set /p=%%i。<nul&echo.&echo.&set str=!str:%%i=!
)


Last edited by zw19750516 on 2008-7-14 at 12:28 AM ]




批处理之家新域名:www.bathome.net
2008-7-14 00:27
查看资料  发送邮件  发短消息  网志  OICQ (841615149)  编辑帖子  回复  引用回复
hackerscans
初级用户





积分 73
发帖 51
注册 2007-8-31
状态 离线
『第 23 楼』:   使用 LLM 解释/回答一下

小菜在这学习了。 也恭喜ZW19750516荣升金牌会员。


2008-7-14 09:20
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 24 楼』:   使用 LLM 解释/回答一下

qzwqzw 兄能否写个sed版本的出来?我想学习一下。
我写的不行,管道后面的部分看起来没有起作用。
sed "s/。/。\n/g" a.txt | sed "/。$/!s/\n//g"




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




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 25 楼』:  来个 sed 版的。 使用 LLM 解释/回答一下

sed "s/。/&\n\n/g" myfile.txt | sed ":nt; /。$\|^$/!{N;bnt};s/\n//g"


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





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 26 楼』:   使用 LLM 解释/回答一下

Originally posted by lxmxn at 2008-7-14 15:03:
sed "s/。/&\n\n/g" myfile.txt | sed ":nt; /。$\|^$/!{N;bnt};s/\n//g"

头都想破了都没想出来,
版主能解释一下这个地址么?
/。$\|^$/ 这里中间的 这个 管道是或者的意思么?那么前面的 \ 就是转义符号了?
你的代码在句号开头的行时会多显示一空行,我修改如下,不知道会在某种情况下出错吗?
另外:不用管道符号能解决吗?

sed "s/。/&\n\n/g" a.txt | sed ":nt; /。$/!{N;b nt};s/\n//g;n"


Last edited by 26933062 on 2008-7-14 at 03:29 PM ]




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





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 27 楼』:   使用 LLM 解释/回答一下

斑竹高明,学习了。
不过我发现这样会在原本以句号结尾的行后面添加一个多余的空行,修改如下:
sed "s/。/&\n\n/g" a.txt | sed "/^$/{:a;N;s/^\n$//;ta}" | sed ":a; /。$\|^$/!{N;ba};s/\n//g"




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





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 28 楼』:   使用 LLM 解释/回答一下

\是转义符,|不是管道,而是“或”
/。$\|^$/!表示对不是以句号结尾的非空行执行后面的命令




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

天的白色影子


积分 2343
发帖 636
注册 2004-3-6
状态 离线
『第 29 楼』:   使用 LLM 解释/回答一下

抱歉,更正一句

实现楼主的意图最简洁、高效和通用的方案
是用change、hexc等全文文本替换工具
而非sed/awk等行缓冲形式的文本编辑工具
因为后者处理跨行问题时语法会过于晦涩
而且兼容性也不是很高
因为sed、awk的多个实现对许多非标准标记支持有很大不同

sed我了解的很少
基本上我就了解了正则表达式的那一部分
其它的没有接触
但我对:nt、{N;b nt}等类似标记的兼容性存疑

Last edited by qzwqzw on 2008-7-14 at 03:55 PM ]


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




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 30 楼』:   使用 LLM 解释/回答一下

嗯,就是或的意思,其实我对sed也不精,自己乱写的一个。。。


2008-7-14 15:53
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复

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


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



论坛跳转: