代码: 全选
sed -n "/^function /s/function \([a-z_]*\).*/\1/p" envsetup.sh
这样运行后,会显示function的名字,
我看不懂为什么
代码: 全选
\([a-z_]*\).*/
代码: 全选
function idea()
代码: 全选
sed -n "/^function /s/function \([a-z_]*\).*/\1/p" envsetup.sh
代码: 全选
\([a-z_]*\).*/
代码: 全选
function idea()
从运行的结果我也知道吃掉了,但是为什么呢?aerofox 写了:.* 是为了吃掉函数名后的字符。
不过你这个正则表达式中无法识别函数名中的数字和大写字母,只有保证函数名都是用小写字母和下划线组成的才能正确。
代码: 全选
.* 匹配任何字符, 也就是把前面的表达式吃剩下的,全部吃掉。
代码: 全选
sed -n "/^function /s/function \([a-z_]*\).*/\1/p" envsetup.sh
代码: 全选
^function
代码: 全选
s/function \([a-z_]*\).*/\1/
代码: 全选
/function \([a-z_]*\).*
代码: 全选
\1
有两点不明:yaoms 写了:. 匹配任何字符,
* 表示 0-n个
zhangxiaofir 写了:重新理了下思路代码: 全选
sed -n "/^function /s/function \([a-z_]*\).*/\1/p" envsetup.sh
找到function开头的行代码: 全选
^function
用\1内容替换function \([a-z_]*\).*代码: 全选
s/function \([a-z_]*\).*/\1/
找到符合这个规则的行 #如果把.*去掉匹配到的是function idea 而后面的()会被保留代码: 全选
/function \([a-z_]*\).*
代表了\([a-z_]*\) 匹配的内容 在你的例子中匹配到的是idea 如果去掉.* 在第二步匹配的时候没匹配到()所以最后\1只会替换掉function idea 而不会替换掉()代码: 全选
\1
这样楼主清楚了吧?
ps: .*的意思估计楼主知道 应该是sed楼主没搞懂