LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1026|回复: 8

正则表达式中的点

[复制链接]
发表于 2009-4-24 07:04:29 | 显示全部楼层 |阅读模式
我的系统是CentOS 5
在学习中有一点搞不清楚,应该是我的概念不清吧,我把问题贴出来:
  1. [b] ls[/b]
复制代码

ttt     ttt11.txt  ttt22.mp3  ttt33txt  ttt.mp3
ttt11.mp3 ttt13.txt  ttt23.txt   ttt33.txt

用正则表达式:
  1. [b] ls ttt[22-33]* [/b]
复制代码

结果
ttt22.mp3  ttt23.txt  ttt33txt  ttt33.txt

到这里没问题,但是:
  1. [b] ls ttt[22-33].* [/b]
复制代码

结果
ls: ttt[22-33].*: No such file or directory

这里只相差一个点,为什么就不行呢?用了转移符\也是不行的。
谢谢!
 楼主| 发表于 2009-4-24 08:07:27 | 显示全部楼层
如果这样则没问题:
ls ttt[22-33]?.*
但还是没能达到效果。
恐怕这个点不能跟在方括号后面,不知道是不是这样。
回复 支持 反对

使用道具 举报

发表于 2009-4-24 11:41:18 | 显示全部楼层
  1. touch ttt[22-33].*
复制代码
然后
  1. ls ttt[22-33].*
复制代码
……

在 ls 下正则表达式有点问题,至少在我的 fedora 下也是一样……匹配没有像我们想的那样进行。事实上"." (dot|period) 应该匹配除换行外任意的字符。

试一下
  1. ls | grep ttt[22-33].*
复制代码
结果很有意思……

其实上, * 也不是你想的那样工作的……

参考一下:
http://zh.wikipedia.org/wiki/%E6 ... 8%E8%BE%BE%E5%BC%8F
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-4-24 17:50:41 | 显示全部楼层
谢谢!
事实上 ls | grep ttt[22-33].*的效果和 ls ttt[22-33]*是一样的,呵呵。
ttt22.mp3
ttt23.txt
ttt33txt
ttt33.txt
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-4-24 17:58:41 | 显示全部楼层
批量创建用花括号
  1. touch ttt{22,33}{.,}{mp3,txt}
  2. ls
复制代码

ttt22mp3   ttt22txt  ttt33mp3   ttt33txt
ttt22.mp3  ttt22.txt  ttt33.mp3  ttt33.txt
但是少了ttt23*文件
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-4-24 18:03:54 | 显示全部楼层
用中括号却产生不了对应的文件

  1. touch ttt[22-33].*
  2. ls
复制代码

结果产生了文件
ttt[22-33].*

删除用转意符号\
  1. rm ttt\[22-33\].\*
复制代码

rm: remove regular empty file `ttt[22-33].*'? y
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-4-24 18:27:44 | 显示全部楼层
  1. [b] ls[/b]
复制代码

ttt22mp3  ttt22txt  ttt33mp3   ttt33txt
ttt22.mp3   ttt22.txt  ttt33.mp3  ttt33.txt
带中括号的删除
  1. [b]rm -f ttt[22-33].*[/b]
  2. [b]ls[/b]
复制代码

结果没成功
ttt22mp3   ttt22txt   ttt33mp3   ttt33txt
ttt22.mp3  ttt22.txt  ttt33.mp3  ttt33.txt

带花括号的删除
  1. [b] rm -f ttt{22,33}.*[/b]
  2. [b]ls[/b]
复制代码

结果成功了
ttt22mp3  ttt22txt  ttt33mp3  ttt33txt

看来这个点跟在花括号后则没问题,在中括号后却不尽人意。
回复 支持 反对

使用道具 举报

发表于 2009-4-25 23:48:52 | 显示全部楼层
这个其实叫做Shell的[color="Red"]路径扩展,与正则表达式是有很大的不同的
其中的“.”大多数情况下就表示一个点,与跟在什么后面没有关系。[22-33]实际上就是[color="Red"]2或者3
所以
  1. ls    ttt[22-33].*
复制代码
可以匹配
  1. ttt2.   ttt2.txt   ttt2.mp3     ttt3.     ttt3.mp3     ttt3.txt
复制代码
显然这些文件你的目录中确实没有!
回复 支持 反对

使用道具 举报

发表于 2009-4-28 10:05:54 | 显示全部楼层
[22-33]貌似不是Regex的写法,[] 在Regex当中是字符匹配 表示匹配[]中罗列的某一个字符。

而Regex的“.”却是代表匹配任意一个字符。

可使用ls将结果罗列,然后grep使用regex筛选所要的结果~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表