中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 批处理支持正则表达式吗? 上一主题 | 下一主题
xipx
初级用户




积分 62
发帖 25
注册 2008-5-27
状态 离线
『楼 主』:  批处理支持正则表达式吗?

我想在批处理用正则表达式来做替换工作,现实吗?

2008-5-27 16:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 2 楼』:  

仅仅CMD自带的命令的话,不现实。目前所知,仅findstr能支持查找时的少数几个RE字符。

不过可以考虑移植一些win32下用的nix命令进来
比如sed gawk等

2008-5-27 16:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





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

findstr /?

Regular expression quick reference:
  .        Wildcard: any character
  *        Repeat: zero or more occurances of previous character or class
  ^        Line position: beginning of line
  $        Line position: end of line
  [class]  Character class: any one character in set
  [^class] Inverse class: any one character not in set
  [x-y]    Range: any characters within the specified range
  \x       Escape: literal use of metacharacter x
  \<xyz    Word position: beginning of word
  xyz\>    Word position: end of word

For full information on FINDSTR regular expressions refer to the online Command
Reference.



2008-5-27 16:48
查看资料  发短消息 网志   编辑帖子  回复  引用回复
xipx
初级用户




积分 62
发帖 25
注册 2008-5-27
状态 离线
『第 4 楼』:  



  Quote:
Originally posted by pooronce at 2008-5-27 04:34 PM:
仅仅CMD自带的命令的话,不现实。目前所知,仅findstr能支持查找时的少数几个RE字符。

不过可以考虑移植一些win32下用的nix命令进来
比如sed gawk等

请问能通过findstr命令来替换文本吗?

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





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



  Quote:
Originally posted by xipx at 2008-5-28 09:59 AM:

请问能通过findstr命令来替换文本吗?:(

把你的具体要求写出来,自然有人贴代码。



2008-5-28 10:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 6 楼』:  

findstr语句是批处理中唯一的正则表达式,但用其进行替换必须要考虑效率的问题,如果可能的化尽量使用if语句来代替findstr语句。



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




积分 62
发帖 25
注册 2008-5-27
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by HAT at 2008-5-28 10:05 AM:

把你的具体要求写出来,自然有人贴代码。

譬如,替换所有的e-mail为空。

2008-5-28 10:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 8 楼』:  

set str=%str:e-mail=%



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




积分 62
发帖 25
注册 2008-5-27
状态 离线
『第 9 楼』:  



  Quote:
Originally posted by zw19750516 at 2008-5-28 10:24 AM:
set str=%str:e-mail=%

是替换所有e-mail格式的字符串
例如:
abc@163.com
acro@hotmail.com
war@74y.com

2008-5-28 10:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 10 楼』:  

a.txt
替换所有e-mail格式的字符串
abc@163.com
acro@hotmail.com
war@74y.com
www.baidu.com
@time
替换的批处理:
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (
    set str=%%i
    if "%%~xi"==".com" (
       if "!str:@=!"=="!str!" (
          echo %%i
          ) else (
          echo.
       )
       ) else (
       echo %%i
    )
)
pause




批处理之家新域名:www.bathome.net
2008-5-28 11:06
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 11 楼』:  

不现实的,我曾经头疼过
因为findstr只能检索出RE所在的行,并不能确定RE在这行中的位置或者剥离出RE来
所以,要实现替换还是引入其它命令的好。

2008-5-28 11:08
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 12 楼』:  再加难点:

a.txt
替换所有e-mail格式的字符串为www.cn-dos.net
ping /n 2 127.1 abc@163.com
tracert acro@hotmail.com /n
war@74y.com
netstat www.baidu.com begin
@time
12345@qq.com
批处理:
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (
    set str=%%i
    if "!str:@=!"=="!str!" (
       echo %%i
       ) else (
       if "!str:.com=!"=="!str!" (
          echo %%i
          ) else (
          call :lp
          echo !var:~1!&set var=
       )
    )
)
pause>nul&goto :eof
:lp
for %%i in (%str%) do (
    set a=%%i
    if not "!a:@=!"=="!a!" set a=www.cn-dos.net
    set var=!var! !a!
)
ps:这个用findstr是根本做不到的。

[ Last edited by zw19750516 on 2008-5-28 at 12:26 PM ]



批处理之家新域名:www.bathome.net
2008-5-28 12:20
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
26933062
银牌会员





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

不太同意12楼的说法,首先,findstr并不是如你所说的那样效率低下,
做个测试。
假设a.txt内容有一万行,而e-mail格式的行只有10行,现要求显示含e-mail格式的行。
你用for和findstr分别做个测试看看时间差,就知道findstr会比for要快多少倍了。
另外:你12楼代码并不严谨,假设a.txt内容含有以下几行(非正规e-mail格式),你的结果会有错误
@time
25.com @
@dg.com
a@dg.com
aaa@.com
.com@age
而这个问题,用for配合findsgr正则,就很容易完成。
当然前提和你的一样,a.txt每行的内容只能含有一个@和.com字符窜。
:
@echo off&setlocal enabledelayedexpansion
for /f "tokens=1* delims=:" %%a in ('findstr /in "..*@..*.com" a.txt') do set _%%a=a
for /f "tokens=1* delims=:" %%a in ('findstr /n .* a.txt') do (
  set "str=%%b"
  if defined _%%a (
     for %%i in (!str!) do (
       set "a=%%i"
       if not "!a:@=!"=="!a!" set a=www.cn-dos.net
       set var=!var! !a!
     )
     echo !var!
   ) else echo %%b
   set "var="
)
pause
[ Last edited by 26933062 on 2008-5-28 at 01:14 PM ]



致精致简!
2008-5-28 13:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 14 楼』:  

非正规e-mail格式???????????
findstr /in "..*@..*.com这种表达式还是第一次看到。

[ Last edited by zw19750516 on 2008-5-28 at 03:12 PM ]



批处理之家新域名:www.bathome.net
2008-5-28 15:08
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 15 楼』:  



  Quote:
Originally posted by 26933062 at 2008-5-28 01:06 PM:
不太同意12楼的说法,首先,findstr并不是如你所说的那样效率低下,
做个测试。
假设a.txt内容有一万行,而e-mail格式的行只有10行,现要求显示含e-m ...

算是一种解决方法吧
但主要的问题就是不严谨了,要实现严谨的话又非常困难
比如邮件用的ccTLD,除了.com之外还有很多,像.net,.cn,.org.com.cn等等
另外也提到了,一行中只能一个@和ccTLD也是不大现实的

findstr要严谨地查找到已经比较困难了,而那一行再用for来处理就更是麻烦得多了。

这也是findstr的一大弱点吧,希望在后面的win系统中能将findstr强化了。

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

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


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



论坛跳转: