[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]BAT怎样找到连续使用句号的句子并显示出来?

本帖最后由 每天几分 于 2012-10-31 15:36 编辑

比如:
    青云山脉巍峨高耸,虎踞中原,山阴处有大河“洪川”,山阳乃重镇“河阳城”,扼天下咽喉,地理位置十分重要。
    青云山连绵百里。峰峦起伏。最高有七峰。高耸入云。平日里只见白云环绕山腰。不识山顶真容。
青云山山林密布。飞瀑奇岩。珍禽异兽。
在所多有。景色幽险奇峻。天下闻名。

    只是更有名的,却是在这山上的修真门派——青云门。
    青云一脉历史悠久,创派至今已有两千余年,为当今正邪两道之首。据说开派祖师本是一个江湖相师,半生潦倒,郁郁不得志。在其四十九岁那年,云游四方,路经青云山,一眼便看出此山钟灵奇秀,聚天地灵气,是一绝好之地。当下立刻登山,餐风饮露,修真炼道,未几,竟于青云山深处一处密洞内,得到一本无名古卷,上载各般法门妙术,艰深枯涩,却是妙用无穷,威力巨大。
……
==========================
要求:将红色字部分(即未用逗号,连续使用句号)的句子显示到一个新文本中。

谢谢楼下3位!
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 wc726842270 于 2012-11-1 06:48 编辑

回复 7# CrLf


    学习了,最初学时,不知是何意。不过ZM也真够细心了,写完了之后也用ASCKII试了一下,不过没发现什么异常,看来还是少了
刚看到你的回贴时,想了一下,FINDSTR应该是传回了指针常量,之后逐字节对比,如果在NUL前全部匹配的话,则传回被操作字符串的首指针,
如果是只是查单的话,却实可能,不过随着长度的增加这种机率也下降了,不过不可否认,这却实是个漏动。
看来还是加个"/L”要保险啊
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

本帖最后由 CrLf 于 2012-11-1 03:40 编辑

回复 6# wc726842270


   http://bbs.bathome.net/viewthread.php?tid=507
   http://bbs.bathome.net/viewthread.php?tid=7629&
findstr 搜索宽字符时,无开关有时会常出现搜不到匹配行的现象(使用多个关键词时尤为明显),而加了开关后容易导致错误匹配,比如:
  1. @echo off
  2. findstr /r "。" %0
  3. :: #
  4. pause
复制代码
这是因为 "。" 的 hex 为 A1 A3,而 " #" 则是 A1 A1 A3 A3,findstr 按 gbk 逐字节匹配的时候发现后者符合前者的条件:A1 [A1 A3] A3,但其实这是错误的...而 find 貌似是以 unicode 逐字符匹配,反正不存在这个毛病

不过刚测试时发现错误匹配貌似是 /r 开关导致的,其他开关似乎没出现这个现象,看来使用 findstr 匹配宽字符时要尽量避免用正则
1

评分人数

TOP

回复 5# CrLf


    确实是字节,不过还请举例说明
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

回复 4# wc726842270


    findstr 匹配gbk宽字节时有一点小问题,因为它实际上是逐字节匹配的,所以经常可能得出错误的结果,这种情况建议用 find 代替

TOP

即然L上给了VBS的方法,我就来个P的吧,至于效率么,不适用于大的文件
只是根椐你的描述所写,
  1. @echo off
  2. findstr /v /i "," a.txt|findstr /i ".*。.*。"
  3. pause
复制代码
1

评分人数

枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

vbs 用正则可能更方便些:
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. text = fso.OpenTextFile("a.txt",1).ReadAll
  3. With New RegExp
  4. .Global = True
  5. .MultiLine = True
  6. .Pattern = "^[^,]+$"
  7. Set ar = .Execute(text)
  8. End With
  9. For Each a In ar
  10. str = str & a & vbCrLf
  11. Next
  12. fso.CreateTextFile("b.txt",True).Write str
复制代码
1

评分人数

TOP

保存为vbs,试试看吧
  1. Set FSO = CreateObject("Scripting.FileSystemObject")
  2. Set File = FSO.OpenTextFile("a.txt",1)
  3. Do Until File.AtEndOfStream
  4.    Text = File.ReadLine
  5.    A = Split(Text,"。")
  6.    B = Split(Text,",")
  7.    If UBound(A) > 1 And Ubound(B) = 0 Then
  8.       Str = Str & Text & vbCrLf
  9.    End If
  10. Loop
  11. FSO.CreateTextFile("b.txt",True).Write Str
复制代码
1

评分人数

TOP

返回列表