中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]遍历处理文本特殊内容的需求
作者:
标题: [求助]遍历处理文本特殊内容的需求 上一主题 | 下一主题
pkto
初级用户





积分 62
发帖 62
注册 2007-7-14
状态 离线
『楼 主』:  [求助]遍历处理文本特殊内容的需求

有若干子文件夹,每个文件夹里都有若干文本,求助:
1、如何遍历这些文件夹里的文本,将每个文本里纯粹由半角字符(如:半角空格,半角标点,半角符号,英文,数字等等)组成的行删除;
2、将包含连续超过20个半角字符的行(如:“去年!~)&(^(123 &^ $#@,.?我们的工作/88\765”这样的行)删除;
3、将连续两个全角空格替换回车;
4、删除所有没有字符的空行;
5、清除特定的词组(例如:文本中包括“2007年报告指出”之类的词组)。

以上环境在CMD下

[ Last edited by pkto on 2009-1-21 at 11:43 ]

2009-1-21 09:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
yishanju
银牌会员

[b]看你妹啊[/b]


积分 1488
发帖 1357
注册 2006-5-20
状态 离线
『第 2 楼』:  

替换字符串,强烈推荐 命令行工具: fr find - replace http://baiy.cn/utils/fr/index.htm

 

简介

fr - 在文件中批量查找并替换匹配的字符串
支持一次性指定多个文件通配符和文件列表。
支持管道模式,与其它命令协同工作;支持半管道模式,从文件中获取输入,但将结果写到标准输出。
支持包含子目录。
支持普通匹配、正则匹配、可忽略大小写、可跨行匹配。替换时可以使用正则的子表达式。
支持高级正则表达式(ARE)。
同时支持 posix 标准的扩展正则表达式及 perl 风格的正则匹配。
可以格式化替换内容为全大写或全小写,便于在批处理中对环境变量和命令行参数做大小写一致化处理。
支持 DOS(Windows)、Macintosh 和 unix 风格的换行符,可选择自动识别(默认)或手动指定。
统计功能,列出每个文件中的替换次数、总替换次数等。
支持Win32和纯DOS环境(纯DOS环境中需要 HX DOS Extender 支持)。


 
更新历史

2008-09-09, Ver 2.1.4.0909
UPD: 增强了正则行首锚点 '^' 的适应性。

2008-09-08, Ver 2.1.3.0908
FIX: 纠正了正则表达式零长匹配时会出现无限循环的问题(例如,在内容“aaa.bbb”中将“[^.]*”替换为“z”)。
FIX: 纠正了正则行首锚点解析不正确的问题(例如,在内容“ccc”将“^c”替换为“z”)。

2008-08-16 Ver 2.1.2.1126
新增高级正则表达式(ARE)支持

2007-01-20 Ver 2.1.1.120
新增 -exp 选项,开启该选项后,程序的内存使用量将增加一倍,但是在很多情况下,其处理速度将得到极大改善。碰到性能问题的弟兄们可以试试。

该算法使用额外的内存消除了原地替换时带来的内存抖动,所以文件中要替换的值越多,算法带来的性能提升就越明显。在 siwen@CCF 兄提供给我的样本上测试,开启了 -exp 选项以后,fr 完成任务的时间从 1小时 降低到 1.5 秒(文件体积 8.5MB,文件中需要替换的项目为 25 万项)。


 

典型应用

在命令行中单独使用,或作为管道过滤器使用。例如:“unzip -l *.zip | fr /r:"^(.{22}:\d\d\s*|(A| \a| -|.*files$).*\n)" /t”将当前目录下的所有zip文件中的文件干净地列出,同时过滤标题行、统计行以及每行的文件大小、修改时间等内容。
 
在批处理中应用。批处理片断:fr *.lst -fic:NewDir -tu:"%1" 将当前目录下所有 .lst 文件中的 newdir 替换为第一个命令行参数(全大写)。

另一个简单的例子:将“@fr kog-Swd5b.sfv /r:"^(.*) (\x\x)(\x\x)(\x\x)(\x\x)$" /t:"\5\4\3\2 *\1"”保存为批处理文件“sfv2hash.bat”,在下载任何带有 sfv 校验信息的文件后,可以使用 sfv2hash check.sfv 将其转换为标准 hash 信息格式。然后就可以使用 crypto v check.sfv /halgm:crc32 或其它散列验证工具进行文件验证。
 
与其它工具配合使用。


 

简单中文帮助

C:\Documents and Settings\Administrator>
#fr

===============================================================================
  find and replace Ver 2.1.1.120 by BaiYang / 2004 - 2007, 免费软件
                   主页地址 - http://baiy.cn
===============================================================================
在文件和管道中寻找字符串,并将它们替换为其它内容

用法: fr [文件通配符1 文件通配符2 ...] {查找选项:查找内容} {替换选项:替换为}
         [其它选项]

===============================================================================
查找选项:
  -f:      - 匹配精确串
  -fic:    - 匹配精确串(忽略大小写)
  -r:      - 正则表达式匹配
  -ric:    - 正则表达式匹配(忽略大小写)
  -rnnl:   - 跨行正则匹配
  -rnnlic: - 跨行正则匹配(忽略大小写)

===============================================================================
替换选项:
  -t:      - 将匹配的内容替换为指定字符串
  -tu:     - 先将指定的“替换为”字符串变为大写,然后开始替换
  -tl:     - 先将指定的“替换为”字符串变为小写,然后开始替换
  -h -?    - 当前屏幕
  注意: 如果您正在使用正则匹配,那么您可以在“替换为”字符串中使用子表达式代换
        (\0 ~ \9)

===============================================================================
其它选项:
  -s       - 包含子目录
  -exp     - 启用内存扩展算法,将会加倍 fr 的内存使用量,但是很多时候可以极大地
             提高执行效率。如果你碰到了性能问题,可以尝试开启该选项。
  -stdin   - 从标准输入设备获得要查找的内容,并将结果从到标准输出设备(如果未指
             定任何文件模板的话,则自动启用该选项)
  -stdout  - 像平时一样, 从文件中获得输入, 但将结果送到标准输出(而不是写回文
             件)
  -frc     - 显示每个文件内发生的替换次数
  -trc     - 显示所有文件总共发生的替换次数

===============================================================================
POSIX 和 Perl 风格的正则表达式:

  - "find - replace" 完整支持 POSIX.2 扩展标准及 Perl 风格的正则表达式。
    以下是支持的字符类及其对应关系:
       POSIX           perl       描述
       --------------------------------------------------------------------
       [:alnum:]                  字母和数字
       [:alpha:]       \a         字母
       [:lower:]       \l         小写字母
       [:upper:]       \u         大写字母
       [:blank:]                  空格和制表符
       [:space:]       \s         空白字符
       [:cntrl:]                  控制字符
       [:digit:]       \d         十进制数字
       [:xdigit:]      \x         十六进制数字
       [:graph:]                  可打印字符(不包括空白符)
       [:print:]       \p         可打印字符(包括空白符)
       [:punct:]                  标点符号

  - 以下是一些 perl 的特殊字符类:
       perl   POSIX等效         描述
       --------------------------------------------------------------------
       \o     [0-7]             八进制数字
       \O     [^0-7]            非八进制数字
       \w     [[:alnum:]_]      单词组成
       \W     [^[:alnum:]_]     非单词组成
       \A     [^[:alpha:]]      非字母
       \L     [^[:lower:]]      非小写字母
       \U     [^[:upper:]]      非大写字母
       \S     [^[:space:]]      非空白符
       \D     [^[:digit:]]      非十进制数字
       \X     [^[:xdigit:]]     非十六进制数字
       \P     [^[:print:]]      非可打印字符
       \<     [^[:alpha:]_]     单词开始
       \>     [^[:alnum:]_]     单词结束

  - 注意: posix 字符类是必须工作在集合中的(“[”和“]”内)。相反,perl 风格
          的字符类是工作在集合运算之外的。

  - 此外,为了便于在命令行输入一些特殊字符,特别定义了一下别名:
       perl风格      POSIX风格       描述
       -----------------------------------------------------------------------
       \"            [:dq:]          双引号
       \'            [:sq:]          单引号
       \t            [:tb:]          制表符
       \n            [:nl:]          换行符 (0x0A)
       \r            [:rt:]          回车符 (0x0D)
       \b            [:bs:]          退格符

===============================================================================
开关的前缀和后缀:
  * 所有命令行开关(选项)都是大小写无关的(如: "-fic:" 和 "-FIC:")
  * 开关的前缀可以是 "-" 或 "/"(如: "/s" 和 "-s")
  * 开关的后缀可以是 ":" 或 "="(如: "/f:", "/f=", "-f:" 和 "-f=" 等效)

===============================================================================
应用示例:
  fr *.txt *.htm -f:teh -t:the
  fr *.txt -fic:"My Dir" -tu:"%ROOTDIR%"
  type server.log | fr /r:"Connected.*218.79" /t:"**Attack** \0"
  type server.log | fr /r:"^(Smith|James).*\n" /t
  unzip -l *.zip | fr /r:"^(.{22}:\d\d\s*|(A|  \a| -|.*files$).*\n)" /




有问题请发论坛或者自行搜索,再短消息问我的统统是SB
2009-1-21 10:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pkto
初级用户





积分 62
发帖 62
注册 2007-7-14
状态 离线
『第 3 楼』:  

谢谢yihanju兄的回贴,但答案不是正解。如果是正则替换的话,有很多软件都可以实现的,象偶最擅长的textpro,就经常用它来处理文档,只要设置好表达式即可,在其中半角只需/~f就可以全部表达,而不象兄台说的数字、符号、英文单独用公式表达,这样效率并不高。而且兄台民指的方式,好象对汉字或者汉字的全角空格是不能操作的,所以偶只想用bat处理,不想再随身携带其它的软件。

[ Last edited by pkto on 2009-1-21 at 11:42 ]

2009-1-21 11:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
yishanju
银牌会员

[b]看你妹啊[/b]


积分 1488
发帖 1357
注册 2006-5-20
状态 离线
『第 4 楼』:  

fr是一个命令行字符串查找替换工具,我自己用着非常顺手,少写N行批处理

bat 处理文本的功能比较弱,繁杂的处理用相应工具处理比较好




有问题请发论坛或者自行搜索,再短消息问我的统统是SB
2009-1-21 12:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pkto
初级用户





积分 62
发帖 62
注册 2007-7-14
状态 离线
『第 5 楼』:  



  Quote:
Originally posted by yishanju at 2009-1-21 12:50 PM:
fr是一个命令行字符串查找替换工具,我自己用着非常顺手,少写N行批处理

bat 处理文本的功能比较弱,繁杂的处理用相应工具处理比较好

那好,既然yishanju兄这么说,就请针对偶提出的需要,给出答案可好?偶对这个工具一点都没有概念的说,如果现在开始学习,恐怕有些慢……

2009-1-22 06:00
查看资料  发短消息 网志   编辑帖子  回复  引用回复
yishanju
银牌会员

[b]看你妹啊[/b]


积分 1488
发帖 1357
注册 2006-5-20
状态 离线
『第 6 楼』:  

这次学会了,下次就不慢了

   此帖被 -2 点积分    点击查看详情   
评分人:【 pkto 分数: -2  时间:2009-1-22 21:12





有问题请发论坛或者自行搜索,再短消息问我的统统是SB
2009-1-22 10:30
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





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

4楼说到重点



S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
2009-1-22 21:45
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 8 楼』:  楼主也灌不少水,这个行不

@echo off&setlocal ENABLEDELAYEDEXPANSION
::所有set /p只是用来显示进度
::要读取所有文件,请自行再加一个for循环

set "cut="要去除的串列表" "注意:" "用空格隔开," "和用双引号引起来""
set file=lent.txt
::out!file!为输出文件
cd.>out!file!

::读取文本,丢掉空行
for /f "tokens=*" %%a in ('type !file!') do (
cls
echo.&echo.&echo.&set /p =正在处理请稍候.<nul
set "str=%%a"
call :sub
)
echo.完成.. &type out!file!
pause
goto :eof

::丢掉纯半角行和半角字符多或等于20的行
:sub
call :getlen2 strlen0
set str=!str:"=""!
call :getlen2 strlen2
for /f "skip=1 delims=:" %%a in ('^(echo "!str!"^&echo.^)^|findstr /o ".*"') do set/a strlen1=%%a-5
if !strlen1!==!strlen2! goto :eof
set /a m=strlen2*3-strlen1-strlen0
if !m! gtr 19 goto :eof
::**********************************


::清除特定词组
for %%a in (!cut!) do set "str=!str:%%~a=!"
::************

set /p =..<nul

::4个空格变回车换行
set "str=!str:2=22!"
set "str=!str:    =020!"
set "str=!str: =a2a!"
set "str="!str:020=" "!""
for /f "tokens=1-8" %%b in ('echo !str!') do call :ret %%b&call :ret %%c&call :ret %%d&call :ret %%e&call :ret%%f &call :ret %%g&call :ret %%h&call :ret %%i
::****************
goto :eof


:getlen2
set n=0&set "s=!str!"
:loop
set /a n=!n!+16
set "m=!s!fedcba9876543210"
set "s=!str:~%n%!"
if defined s goto loop
set /a %1=0x!m:~16,1!+!n!-15
set /p =.<nul
goto :eof

:ret
set /p =.<nul
set "ret=%~1"
if not defined ret goto :eof
set "ret=!ret:a2a= !"
set "ret=!ret:22=2!"
set "ret=!ret:""="!"
echo !ret!>>out!file!
goto :eof

[ Last edited by netbenton on 2009-1-24 at 02:38 ]

   此帖被 +1 点积分    点击查看详情   
评分人:【 pkto 分数: +1  时间:2009-1-24 12:10




精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-1-24 02:14
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
yishanju
银牌会员

[b]看你妹啊[/b]


积分 1488
发帖 1357
注册 2006-5-20
状态 离线
『第 9 楼』:  

本来回你的贴就没什么恶意的意思,居然被你咬成这样,又是我骂我充内行又是说我抄袭的。令人感慨

你在某个论坛上,发了某篇帖子,然后我都不是按你的希望来回复的,你就愤怒了是吗?

[ Last edited by yishanju on 2009-1-24 at 04:14 ]




有问题请发论坛或者自行搜索,再短消息问我的统统是SB
2009-1-24 04:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 10 楼』:  re 12楼

对我道歉就不用了,想想对其他人有没有必要吧.批处理是多个命令或程序一起处理来达到一定的目的,第三方工具也属于程序呀,只要可以达到想要的目的,就可以借用了.要处理通用性问题可将第三工具转成debug代码或包含在批处理内生成临时文件再调用,就可以了.
再提一下,10楼的代码是可以处理1楼的功能的,只要加个for 提取文件就可以遍历所有文件了,只是效率就没有三方工具高.
也祝你新年快乐!
附增改代码(只贴修改部分):

@echo off&setlocal ENABLEDELAYEDEXPANSION
::所有set /p只是用来显示进度
set "cut="要去除的串列表" "注意:" "用空格隔开," "和用双引号引起来""

::读取所有txt文件
for /f "delims=" %%a in ('dir /b /s *.txt') do (
    set "file=%%a"
rem 直接替换原文件,不产生临时文件
rem 读取文本,丢掉空行
  for /f "tokens=*" %%b in ('type !file!^&cd.^>!file!') do (
       cls
       echo.&echo.&echo.&set /p =正在处理请稍候.<nul
       set "str=%%b"
       call :sub
   )
echo.完成.. &type !file!
pause
)

goto :eof
......


*********
把后面的
echo !ret!>>out!file!
改成:
echo !ret!>>!file!
**********

[ Last edited by netbenton on 2009-1-24 at 20:32 ]



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-1-24 13:08
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
slore
铂金会员





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



  Quote:
Originally posted by pkto at 2009-1-23 09:54:

很搞笑唉,如果这也是重点的话,那还来批处理这里干什么?说实话,偶的需求,如果不是批处理的话,偶早就实现了,而且也极简单 ...

呵呵,不是重点你为什么不坚持使用批处理了呢?
批处理文件和3方软件我们为什么要用?
方便工作提高效率。

批处理某些方面效率低你不能不承认!

你这个需求是要用对吧?而不是研究P处理的语法
功能什么的……你对别人给你脚本你会一句句语句
分析是干嘛的,如何实现的麽?
你不会,因为你不了解批处理。

如果拿来用,效率是第一位,如果是研究你倒可以坚持非用P不可。

很搞笑唉,如果这也是重点的话,那还来批处理这里干什么?
的确搞笑~这个就是你的问题……不要盲目。
先大概了解下批处理的实用范围。

别的问题P处理就方便,我会推荐你使用。


你如果从北京去上海你会骑自行车麽?
有了汽车,火车和飞机,自行车就没有用了?


适当的工具能事半功倍,反之,可能事倍功半



S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
2009-1-24 14:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





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

切!扣分么?


扣分的人自己看清楚,明明是自己。我对分数那种虚的东西不放心上。
加那2分你看着很不舒服非扣点不成?

那句话你如果多去了解下批处理吧。
如果批处理能处理的好,3方软件有必要出现麽?自己琢磨吧。



S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
2009-1-24 14:57
查看资料  发短消息 网志   编辑帖子  回复  引用回复
yishanju
银牌会员

[b]看你妹啊[/b]


积分 1488
发帖 1357
注册 2006-5-20
状态 离线
『第 13 楼』:  

我觉得批处理是不会因为用了第三方工具就不是批处理了




有问题请发论坛或者自行搜索,再短消息问我的统统是SB
2009-1-24 15:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: