中国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] »
作者:
标题: 出题:整理文本 (新手老鸟都来试试) 上一主题 | 下一主题
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 16 楼』:  



  Quote:
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 楼』:  


@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 楼』:  

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



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





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

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 楼』:  

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



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

天的白色影子


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

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

感觉思路和效率都还可以,所以发了:
@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 楼』:  

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

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





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

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 版的。


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 楼』:  



  Quote:
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 楼』:  

斑竹高明,学习了。
不过我发现这样会在原本以句号结尾的行后面添加一个多余的空行,修改如下:
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 楼』:  

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



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

天的白色影子


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

抱歉,更正一句

实现楼主的意图最简洁、高效和通用的方案
是用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 楼』:  

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

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


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



论坛跳转: