分页: 1 / 1

不太明白sed这个用法

发表于 : 2012-11-26 16:07
tosail2010
写法如下:

代码: 全选

sed -n "/^function /s/function \([a-z_]*\).*/\1/p"  envsetup.sh
envsetup.sh中定义了好多function,
这样运行后,会显示function的名字,
我看不懂为什么

代码: 全选

\([a-z_]*\).*/
中有".*", 我试着取消".*",运行后显示的函数名带(),定义格式

代码: 全选

function idea()
为什么呢?

Re: 不太明白sed这个用法

发表于 : 2012-11-26 16:48
zhangxiaofir

代码: 全选

.*
匹配()

代码: 全选

\([a-z_]*\)
匹配idea

代码: 全选

\1
输出第一个()里的内容 即

代码: 全选

\([a-z_]*\)

Re: 不太明白sed这个用法

发表于 : 2012-11-26 17:04
tosail2010
[quote="zhangxiaofir"]

代码: 全选

.*
匹配()
quote]


为什么匹配?不解!

Re: 不太明白sed这个用法

发表于 : 2012-11-26 17:07
zhangxiaofir
被迷惑了。。。 lz需要搞懂这里sed的用法 找到符合规则的把它替换成\1里的东西 之所以把.*去掉 会出现idea()是因为没有了吃()的规则

Re: 不太明白sed这个用法

发表于 : 2012-11-26 18:16
YeLee
或许,你可以理解「.*」为函数名后面到行末的字串。

Re: 不太明白sed这个用法

发表于 : 2012-11-26 20:06
aerofox
.* 是为了吃掉函数名后的字符。
不过你这个正则表达式中无法识别函数名中的数字和大写字母,只有保证函数名都是用小写字母和下划线组成的才能正确。

Re: 不太明白sed这个用法

发表于 : 2012-11-27 9:41
tosail2010
aerofox 写了:.* 是为了吃掉函数名后的字符。
不过你这个正则表达式中无法识别函数名中的数字和大写字母,只有保证函数名都是用小写字母和下划线组成的才能正确。
从运行的结果我也知道吃掉了,但是为什么呢?
我需要一个清楚地解释。从语法角度来解释。

Re: 不太明白sed这个用法

发表于 : 2012-11-27 9:47
yaoms

代码: 全选

.*  匹配任何字符, 也就是把前面的表达式吃剩下的,全部吃掉。

Re: 不太明白sed这个用法

发表于 : 2012-11-27 9:50
yaoms
. 匹配任何字符,
* 表示 0-n个

Re: 不太明白sed这个用法

发表于 : 2012-11-27 10:12
zhangxiaofir
重新理了下思路

代码: 全选

sed -n "/^function /s/function \([a-z_]*\).*/\1/p"  envsetup.sh

代码: 全选

^function 
找到function开头的行

代码: 全选

s/function \([a-z_]*\).*/\1/
用\1内容替换function \([a-z_]*\).*

代码: 全选

/function \([a-z_]*\).*
找到符合这个规则的行 #如果把.*去掉匹配到的是function idea 而后面的()会被保留

代码: 全选

\1
代表了\([a-z_]*\) 匹配的内容 在你的例子中匹配到的是idea 如果去掉.* 在第二步匹配的时候没匹配到()所以最后\1只会替换掉function idea 而不会替换掉()


这样楼主清楚了吧?
ps: .*的意思估计楼主知道 应该是sed楼主没搞懂

Re: 不太明白sed这个用法

发表于 : 2012-12-02 18:40
1036014410
有两点不明:
1、难道'\1'有特殊含义吗?
2、‘.*'是什么意思?通配符里有“.“这一项吗?
着实不懂,望高人回答

Re: 不太明白sed这个用法

发表于 : 2012-12-02 18:45
1036014410
yaoms 写了:. 匹配任何字符,
* 表示 0-n个
有两点不明:
1、难道'\1'有特殊含义吗?
2、‘.*'是什么意思?通配符里有“.“这一项吗?
着实不懂,望高人回答

Re: 不太明白sed这个用法

发表于 : 2012-12-02 18:47
1036014410
zhangxiaofir 写了:重新理了下思路

代码: 全选

sed -n "/^function /s/function \([a-z_]*\).*/\1/p"  envsetup.sh

代码: 全选

^function 
找到function开头的行

代码: 全选

s/function \([a-z_]*\).*/\1/
用\1内容替换function \([a-z_]*\).*

代码: 全选

/function \([a-z_]*\).*
找到符合这个规则的行 #如果把.*去掉匹配到的是function idea 而后面的()会被保留

代码: 全选

\1
代表了\([a-z_]*\) 匹配的内容 在你的例子中匹配到的是idea 如果去掉.* 在第二步匹配的时候没匹配到()所以最后\1只会替换掉function idea 而不会替换掉()


这样楼主清楚了吧?
ps: .*的意思估计楼主知道 应该是sed楼主没搞懂

有两点不明:
1、难道'\1'有特殊含义吗?
2、‘.*'是什么意思?通配符里有“.“这一项吗?
着实不懂,望高人回答