不太明白sed这个用法

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
tosail2010
帖子: 83
注册时间: 2011-03-27 19:01
联系:

不太明白sed这个用法

#1

帖子 tosail2010 » 2012-11-26 16:07

写法如下:

代码: 全选

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

代码: 全选

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

代码: 全选

function idea()
为什么呢?
A year's plan starts with spring.
zhangxiaofir
帖子: 53
注册时间: 2010-12-09 23:54

Re: 不太明白sed这个用法

#2

帖子 zhangxiaofir » 2012-11-26 16:48

代码: 全选

.*
匹配()

代码: 全选

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

代码: 全选

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

代码: 全选

\([a-z_]*\)
头像
tosail2010
帖子: 83
注册时间: 2011-03-27 19:01
联系:

Re: 不太明白sed这个用法

#3

帖子 tosail2010 » 2012-11-26 17:04

[quote="zhangxiaofir"]

代码: 全选

.*
匹配()
quote]


为什么匹配?不解!
A year's plan starts with spring.
zhangxiaofir
帖子: 53
注册时间: 2010-12-09 23:54

Re: 不太明白sed这个用法

#4

帖子 zhangxiaofir » 2012-11-26 17:07

被迷惑了。。。 lz需要搞懂这里sed的用法 找到符合规则的把它替换成\1里的东西 之所以把.*去掉 会出现idea()是因为没有了吃()的规则
上次由 zhangxiaofir 在 2012-11-27 10:02,总共编辑 2 次。
头像
YeLee
论坛版主
帖子: 26406
注册时间: 2008-08-13 8:48
系统: Fundu i64
来自: 东海硇州,一双管钥。
联系:

Re: 不太明白sed这个用法

#5

帖子 YeLee » 2012-11-26 18:16

或许,你可以理解「.*」为函数名后面到行末的字串。
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 不太明白sed这个用法

#6

帖子 aerofox » 2012-11-26 20:06

.* 是为了吃掉函数名后的字符。
不过你这个正则表达式中无法识别函数名中的数字和大写字母,只有保证函数名都是用小写字母和下划线组成的才能正确。
头像
tosail2010
帖子: 83
注册时间: 2011-03-27 19:01
联系:

Re: 不太明白sed这个用法

#7

帖子 tosail2010 » 2012-11-27 9:41

aerofox 写了:.* 是为了吃掉函数名后的字符。
不过你这个正则表达式中无法识别函数名中的数字和大写字母,只有保证函数名都是用小写字母和下划线组成的才能正确。
从运行的结果我也知道吃掉了,但是为什么呢?
我需要一个清楚地解释。从语法角度来解释。
A year's plan starts with spring.
头像
yaoms
帖子: 4952
注册时间: 2007-10-19 14:51
来自: 深圳

Re: 不太明白sed这个用法

#8

帖子 yaoms » 2012-11-27 9:47

代码: 全选

.*  匹配任何字符, 也就是把前面的表达式吃剩下的,全部吃掉。
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
头像
yaoms
帖子: 4952
注册时间: 2007-10-19 14:51
来自: 深圳

Re: 不太明白sed这个用法

#9

帖子 yaoms » 2012-11-27 9:50

. 匹配任何字符,
* 表示 0-n个
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
zhangxiaofir
帖子: 53
注册时间: 2010-12-09 23:54

Re: 不太明白sed这个用法

#10

帖子 zhangxiaofir » 2012-11-27 10:12

重新理了下思路

代码: 全选

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楼主没搞懂
1036014410
帖子: 11
注册时间: 2012-10-31 13:07
系统: loonux

Re: 不太明白sed这个用法

#11

帖子 1036014410 » 2012-12-02 18:40

有两点不明:
1、难道'\1'有特殊含义吗?
2、‘.*'是什么意思?通配符里有“.“这一项吗?
着实不懂,望高人回答
1036014410
帖子: 11
注册时间: 2012-10-31 13:07
系统: loonux

Re: 不太明白sed这个用法

#12

帖子 1036014410 » 2012-12-02 18:45

yaoms 写了:. 匹配任何字符,
* 表示 0-n个
有两点不明:
1、难道'\1'有特殊含义吗?
2、‘.*'是什么意思?通配符里有“.“这一项吗?
着实不懂,望高人回答
1036014410
帖子: 11
注册时间: 2012-10-31 13:07
系统: loonux

Re: 不太明白sed这个用法

#13

帖子 1036014410 » 2012-12-02 18:47

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、‘.*'是什么意思?通配符里有“.“这一项吗?
着实不懂,望高人回答
回复