一个头痛的正则问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
gzbao9999
帖子: 627
注册时间: 2008-11-08 18:34
送出感谢: 0
接收感谢: 1 次

一个头痛的正则问题

#1

帖子 gzbao9999 » 2010-11-12 9:56

路径如下
/home/some.site.com/savepath/xxx.tar.gz
xxx.tar.gz之前的路径的层数不固定,xxx这个名字和后缀名不顾定,路径名称也不固定

需要一个正则,匹配出最后一个/后面的第一个.
要求:只能用正则 (Perl正则 扩展正则都可以)
也许有点难,反正我是撞墙了,感觉捉襟见肘了。

btw:可以用echo /home/some.site.com/savepath/xxx.tar.gz|grep -P 'yourregex' 检测结果是不是正确
也许正则不能搞定它,总之各位试试
气血鼓荡,身体发胀,偶飘上头,三时舒畅
xiangxw
帖子: 114
注册时间: 2010-01-03 10:37
送出感谢: 0
接收感谢: 0

Re: 一个头痛的正则问题

#2

帖子 xiangxw » 2010-11-12 11:54

递归打开目录查找
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
送出感谢: 0
接收感谢: 7 次
联系:

Re: 一个头痛的正则问题

#3

帖子 BigSnake.NET » 2010-11-12 13:06

^.*/[^/.]*\.[^/]*$
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
gzbao9999
帖子: 627
注册时间: 2008-11-08 18:34
送出感谢: 0
接收感谢: 1 次

Re: 一个头痛的正则问题

#4

帖子 gzbao9999 » 2010-11-12 13:44

晕 楼上2个一看就没搞明白情况, :em25 难道是哥表达的不清楚

那个路径就是一字符串,只匹配到那个.就可以了
-----------------------------------------------------------------------------------------
可惜正则的分组,没有忽略的行为 like锚位那样,该死的是锚位里又必须是具体的字符串
气血鼓荡,身体发胀,偶飘上头,三时舒畅
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
送出感谢: 0
接收感谢: 7 次
联系:

Re: 一个头痛的正则问题

#5

帖子 BigSnake.NET » 2010-11-12 13:52

我忘记零宽度匹配怎么写了, 你改一下就是了嘛。。。
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
gzbao9999
帖子: 627
注册时间: 2008-11-08 18:34
送出感谢: 0
接收感谢: 1 次

Re: 一个头痛的正则问题

#6

帖子 gzbao9999 » 2010-11-12 15:54

BigSnake.NET 写了:我忘记零宽度匹配怎么写了, 你改一下就是了嘛。。。
没那么简单,我只是发现正则不是万能了。有点纠结,看有没有超级牛力诞生。
气血鼓荡,身体发胀,偶飘上头,三时舒畅
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30
送出感谢: 2 次
接收感谢: 31 次

Re: 一个头痛的正则问题

#7

帖子 aerofox » 2010-11-13 7:27

代码: 全选

echo /home/some.site.com/savepath/xxx.tar.gz|grep -o -P 'y/\K[^.]*\.'
看帮助写的,没有测试,因为我的系统中的 grep 没有编译 -P 参数。
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30
送出感谢: 2 次
接收感谢: 31 次

Re: 一个头痛的正则问题

#8

帖子 aerofox » 2010-11-13 7:30

上面那个忘了考虑必须是最后一个 /,还要改一改,现在没空研究。
在 vim 中是可以用

代码: 全选

/\/\zs[^\/.]*\.\(.*\/\)\@!
搜索到你要内容的。
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45
送出感谢: 0
接收感谢: 9 次

Re: 一个头痛的正则问题

#9

帖子 fanhe » 2010-11-13 11:35

正则我非常之恼火
各个软件之间,各个平台之间的正则都有区别
我都不知道什么时候用哪个语法的正则!
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30
送出感谢: 2 次
接收感谢: 31 次

Re: 一个头痛的正则问题

#10

帖子 aerofox » 2010-11-13 21:36

用 grep 的:

代码: 全选

echo '/home/some.site.com/savepath/xxx.tar.gz' | grep -o -P '.*/\K[^./]*\.(?!.*/)'
头像
IDRI
帖子: 476
注册时间: 2010-07-02 21:47
送出感谢: 0
接收感谢: 0

Re: 一个头痛的正则问题

#11

帖子 IDRI » 2010-11-13 23:21

用awk 很简单但是不知合不和楼主的意思
awk -F'/' '{print $NF }' | awk -F'.' '{print $1}'
对系统:更加了解; 对软件:更强,更新,更有趣

ubuntu--arch--gentoo

vim(latex-suit),tex(xelatex,metapost),zim,chromium,virtualbox,awk......
tusooa
帖子: 6546
注册时间: 2008-10-31 22:12
系统: 践兔
送出感谢: 6 次
接收感谢: 10 次
联系:

Re: 一个头痛的正则问题

#12

帖子 tusooa » 2010-11-14 21:12

代码: 全选

tlcr: 0 庚寅年十月九日 21:07 ~ 
● perl -pe 's@^.+/(.+?\.).+$@\1@' <<< '/xxx/yyy/zzz/haha.xxx'
haha.
tlcr: 0 庚寅年十月九日 21:07 ~ 
● 
不会用grep -P额。。。

代码: 全选

] ls -ld //
gzbao9999
帖子: 627
注册时间: 2008-11-08 18:34
送出感谢: 0
接收感谢: 1 次

Re: 一个头痛的正则问题

#13

帖子 gzbao9999 » 2010-11-15 10:43

aerofox 写了:用 grep 的:

代码: 全选

echo '/home/some.site.com/savepath/xxx.tar.gz' | grep -o -P '.*/\K[^./]*\.(?!.*/)'
这个最后的结果是xxx. (可是我要的只是那个.)
tusooa 写了:

代码: 全选

tlcr: 0 庚寅年十月九日 21:07 ~ 
● perl -pe 's@^.+/(.+?\.).+$@\1@' <<< '/xxx/yyy/zzz/haha.xxx'
haha.
tlcr: 0 庚寅年十月九日 21:07 ~ 
● 
不会用grep -P额。。。
这个的结果是haha. (和上面的效果一样的,只要那个.)

不过aerofox 的正则里 提供了我想要的关键\K (\K :忽略这个符号之前的正则匹配的所有内容,即便\K出现在分组里面,分组和分组之前的正则匹配到的部分也全部被忽略了)

我把实现写一下

代码: 全选

echo '/home/some.site.com/savepath/xxx.tar.gz'|grep -P '.*/[^.]*\K\.'    
用-P可以直观的看到匹配到哪个点,-Po就只显示点了

测试了一下其他语言 java 和 js中都不支持\K写法。 茶几阿!
气血鼓荡,身体发胀,偶飘上头,三时舒畅
thereisawill
帖子: 167
注册时间: 2009-10-30 8:49
送出感谢: 0
接收感谢: 0

Re: 一个头痛的正则问题

#14

帖子 thereisawill » 2010-11-16 12:36

gvim编辑器

/\\\@<=[^\\]*$
回复

回到 “Shell脚本”