LinuxSir.cn,穿越时空的Linuxsir!

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

sed 子匹配

[复制链接]
发表于 2008-5-24 22:13:23 | 显示全部楼层 |阅读模式
谁比较熟悉sed子匹配.

sed  's/m\(.*\)s/\1/'

不是很懂,有没有相关的介绍.
发表于 2008-5-24 23:09:30 | 显示全部楼层
这个很简单,不知道你哪里不清楚,你应该具体说明白,在括号里面匹配的可以分别用\1到\9引用,这个你应该知道吧,至于包含嵌套括号的,只要按左括号的顺序就可以了,比如用(1(2)(3))(4)匹配1234这个字符串,那么\1匹配的是123,\2是2,\3是3,\4是4,还有在unix类系统里正则表达式分两种,包括基本正则表达式和扩展正则表达式,\(.*\)这种写法属于基本正则表达式,可以给sed加上选项,使其识别的是扩展的正则表达式,\(.*\)就要写成(.*)了,能想到的就这么多了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-5-25 11:08:29 | 显示全部楼层
这是数据文件:
real    0m0.003s
real    0m0.016s

sed  's/m\(.*\)s/\1/' <file  ,这个表达式就是把数据文件里的m和s删除,为了接下来的求和运算。

我的问题是:
\(.*\)  表示子匹配, 应该怎么理解?
\1  表示子匹配的第一次出现,这应该怎么理解?

谢谢
回复 支持 反对

使用道具 举报

发表于 2008-5-25 17:37:46 | 显示全部楼层
Post by soccer;1854698
这是数据文件:
real    0m0.003s
real    0m0.016s

sed  's/m\(.*\)s/\1/' <file  ,这个表达式就是把数据文件里的m和s删除,为了接下来的求和运算。

我的问题是:
\(.*\)  表示子匹配, 应该怎么理解?
\1  表示子匹配的第一次出现,这应该怎么理解?

谢谢

\(.*\)    匹配   0.003   或  0.016   因为这两个都在 m和s 之间
\1         就是匹配到的内容。

如果求和的话,你可以直接这样:
sed 's/.*m\(.*\)s/\1/' < file

这样就只留下 你需要的数字部分了。

当然直接求和加一个 awk 处理:
cat file|sed 's/.*m\(.*\)s/\1/'|awk '{s+=$1} END {print s}'
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-5-25 20:50:03 | 显示全部楼层
谢谢你得解答!
你说的 \1 是指匹配到的内容,在这里是指什么内容,但是下面的解释(文档里查到的)
怎么理解呢?

‘^\(.*\)\1’匹配开始于同一个字符串的两次重复出现的行,请问为什么是2次?

谢谢.
回复 支持 反对

使用道具 举报

发表于 2008-5-26 09:35:29 | 显示全部楼层
例子
echo "microsoft" | sed 's/m\(.*\)s\(.*\)t/\1\2/'
icroof
\1就是icro,\2就是of
回复 支持 反对

使用道具 举报

发表于 2008-6-3 18:49:53 | 显示全部楼层
Post by soccer;1854914
谢谢你得解答!
你说的 \1 是指匹配到的内容,在这里是指什么内容,但是下面的解释(文档里查到的)
怎么理解呢?

‘^\(.*\)\1’匹配开始于同一个字符串的两次重复出现的行,请问为什么是2次?

谢谢.

可能是这样理解吧:
\1重复了括号里的内容,因而是2次。
不知对否。
回复 支持 反对

使用道具 举报

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

本版积分规则

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