分页: 1 / 1
不太明白sed这个用法
发表于 : 2012-11-26 16:07
由 tosail2010
写法如下:
代码: 全选
sed -n "/^function /s/function \([a-z_]*\).*/\1/p" envsetup.sh
envsetup.sh中定义了好多function,
这样运行后,会显示function的名字,
我看不懂为什么
中有".*", 我试着取消".*",运行后显示的函数名带(),定义格式
为什么呢?
Re: 不太明白sed这个用法
发表于 : 2012-11-26 16:48
由 zhangxiaofir
匹配()
匹配idea
输出第一个()里的内容 即
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开头的行
代码: 全选
s/function \([a-z_]*\).*/\1/
用\1内容替换function \([a-z_]*\).*
代码: 全选
/function \([a-z_]*\).*
找到符合这个规则的行 #如果把.*去掉匹配到的是function idea 而后面的()会被保留
代表了\([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开头的行
代码: 全选
s/function \([a-z_]*\).*/\1/
用\1内容替换function \([a-z_]*\).*
代码: 全选
/function \([a-z_]*\).*
找到符合这个规则的行 #如果把.*去掉匹配到的是function idea 而后面的()会被保留
代表了\([a-z_]*\) 匹配的内容 在你的例子中匹配到的是idea 如果去掉.* 在第二步匹配的时候没匹配到()所以最后\1只会替换掉function idea 而不会替换掉()
这样楼主清楚了吧?
ps: .*的意思估计楼主知道 应该是sed楼主没搞懂
有两点不明:
1、难道'\1'有特殊含义吗?
2、‘.*'是什么意思?通配符里有“.“这一项吗?
着实不懂,望高人回答