求一正则表达式的解释

sh/bash/dash/ksh/zsh等Shell脚本
回复
Dic4000
帖子: 104
注册时间: 2008-09-10 21:06
送出感谢: 0
接收感谢: 0

求一正则表达式的解释

#1

帖子 Dic4000 » 2008-11-26 0:08

a.txt文件中有三行内容:
Link encap:Ethernet HWaddr 00:51:FD:52:9A:CA
inet addr:192.168.1.12 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::250:fcff:fe22:9acb/64 Scope:Link

在SHELL下用正则表达式取出192.168.1.12这个IP.
cat -n a.txt| grep 'inet ' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'

文件中没有g和//这些字符,那么正则表达式里面的这两个“//g”分别代表什么意思呢?
头像
HuntXu
论坛版主
帖子: 5778
注册时间: 2007-09-29 3:09
送出感谢: 0
接收感谢: 6 次

Re: 求一正则表达式的解释

#2

帖子 HuntXu » 2008-11-26 0:18

代码: 全选

man sed
HUNT Unfortunately No Talent...
头像
xhy
帖子: 3916
注册时间: 2005-12-28 1:16
系统: Ubuntu 12.10 X64
来自: 火星
送出感谢: 1 次
接收感谢: 0

Re: 求一正则表达式的解释

#3

帖子 xhy » 2008-11-26 0:39

代码: 全选

grep -oE '^inet addr:[0-9.]+' a.txt | grep -oE '[0-9.]+'
不用这么麻烦
目前负债150多万
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

Re: 求一正则表达式的解释

#4

帖子 eexpress » 2008-11-26 10:50

man grep里面就有正则的解释
man regex也有
● 鸣学
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
送出感谢: 0
接收感谢: 3 次
联系:

Re: 求一正则表达式的解释

#5

帖子 xiooli » 2008-11-26 11:01

sed 's/^inet.*addr://g;s/Bcast.*$//g' a.txt
即可。s/xxx/XXX/表示把xxx替换成XXX,加g表示globle即全局替换,不加就只替换一个满足条件的。//g就相当于全部删除了。
xyywll
帖子: 338
注册时间: 2008-05-24 1:24
送出感谢: 0
接收感谢: 0

Re: 求一正则表达式的解释

#6

帖子 xyywll » 2008-11-26 18:57

// 表示删除
如果努力的目的是为了超越他人,那么我们永远成功不了
大道是平的,我们该做的是让自己快乐,同时带给他人快乐
好好涵养自己的性格
才华是刀刃,辛苦是磨刀石
多食果蔬,健康长寿;少吃不吃鱼肉,珍爱它类生命,远离自身疾病
Dic4000
帖子: 104
注册时间: 2008-09-10 21:06
送出感谢: 0
接收感谢: 0

Re: 求一正则表达式的解释

#7

帖子 Dic4000 » 2008-11-28 0:23

xyywll 写了:// 表示删除
谢谢大家了~~~~
大家都说//是表示删除,其实是错误的。
刚开始我以为//是sed中的什么删除标志选项,可是找了man好久都没找到//表示删除的说明,最后在看到一个正则表达式的例子才恍然大悟。
sed '/s/pattern1/pattern2/‘ a.txt

这个命令是将第一个匹配到的pattern1, 替换为pattern2. 如果想将所有的匹配都替换掉则需要写成

sed '/s/pattern1/pattern2/g‘ a.txt

最后那个字符‘g'是sed命令中的选项,含义是在每个匹配的输入行中, 将每个模式匹配都作相应的操作. (即 不只局限于第一个匹配)

如果pattern2为空的话,命令就变成了
sed '/s/pattern1//g‘ a.txt
意思是把匹配的项都替换成空。这就在第一次接触这个sed命令的人看起来,结果好像是把匹配的都被删除了,还以为//g是sed命令中的某个代表删除的选项。

其实我想说的是,希望那些高手在回答像我们刚接触Linux,两眼发黑啥都不懂的人问题时,请耐心一点,针对问题能多几句解释说明,不要泛泛的回答什么找man。我在发贴前就已经大概查了下man,我英文不好,三级都是很勉强的才过,所以只能借助字典大概的看了看。给出的答案即使是英文也没关系,但不要空谈。就算自己去找,也得有个大概的范围吧?我想发个问题如有人能解释一下原因也可以节约很多时间啊,得出答案后也会再对照man相关的条目看一看也不错。如果我说的过火,请那些高手不要在意。 ^_^!
头像
haria1988
帖子: 689
注册时间: 2008-04-17 17:53
来自: 江苏.无锡
送出感谢: 0
接收感谢: 1 次
联系:

Re: 求一正则表达式的解释

#8

帖子 haria1988 » 2008-11-28 0:39

Dic4000 写了:
xyywll 写了:// 表示删除
谢谢大家了~~~~
大家都说//是表示删除,其实是错误的。
刚开始我以为//是sed中的什么删除标志选项,可是找了man好久都没找到//表示删除的说明,最后在看到一个正则表达式的例子才恍然大悟。
sed '/s/pattern1/pattern2/‘ a.txt

这个命令是将第一个匹配到的pattern1, 替换为pattern2. 如果想将所有的匹配都替换掉则需要写成

sed '/s/pattern1/pattern2/g‘ a.txt

最后那个字符‘g'是sed命令中的选项,含义是在每个匹配的输入行中, 将每个模式匹配都作相应的操作. (即 不只局限于第一个匹配)

如果pattern2为空的话,命令就变成了
sed '/s/pattern1//g‘ a.txt
意思是把匹配的项都替换成空。这就在第一次接触这个sed命令的人看起来,结果好像是把匹配的都被删除了,还以为//g是sed命令中的某个代表删除的选项。

其实我想说的是,希望那些高手在回答像我们刚接触Linux,两眼发黑啥都不懂的人问题时,请耐心一点,针对问题能多几句解释说明,不要泛泛的回答什么找man。我在发贴前就已经大概查了下man,我英文不好,三级都是很勉强的才过,所以只能借助字典大概的看了看。给出的答案即使是英文也没关系,但不要空谈。就算自己去找,也得有个大概的范围吧?我想发个问题如有人能解释一下原因也可以节约很多时间啊,得出答案后也会再对照man相关的条目看一看也不错。如果我说的过火,请那些高手不要在意。 ^_^!
:em11
lujinke
帖子: 81
注册时间: 2007-07-20 10:12
送出感谢: 0
接收感谢: 0

Re: 求一正则表达式的解释

#9

帖子 lujinke » 2008-12-04 11:07

我也写一个解决方法:
gawk -F"[ :]" '/^inet /{print $3}' a.txt
就可以拿到192.168.1.12
Dic4000 写了:a.txt文件中有三行内容:
Link encap:Ethernet HWaddr 00:51:FD:52:9A:CA
inet addr:192.168.1.12 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::250:fcff:fe22:9acb/64 Scope:Link

在SHELL下用正则表达式取出192.168.1.12这个IP.
cat -n a.txt| grep 'inet ' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'

文件中没有g和//这些字符,那么正则表达式里面的这两个“//g”分别代表什么意思呢?
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

Re: 求一正则表达式的解释

#10

帖子 eexpress » 2008-12-04 11:14

☎ i='inet addr:192.168.1.12 Bcast:192.168.1.255 Mask:255.255.255.0'; echo ${i##*Mask:}
255.255.255.0
用什么awk哦。不嫌大?
● 鸣学
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
送出感谢: 0
接收感谢: 3 次
联系:

Re: 求一正则表达式的解释

#11

帖子 xiooli » 2008-12-04 19:15

Dic4000 写了:
xyywll 写了:// 表示删除
谢谢大家了~~~~
大家都说//是表示删除,其实是错误的。
刚开始我以为//是sed中的什么删除标志选项,可是找了man好久都没找到//表示删除的说明,最后在看到一个正则表达式的例子才恍然大悟。
sed '/s/pattern1/pattern2/‘ a.txt

这个命令是将第一个匹配到的pattern1, 替换为pattern2. 如果想将所有的匹配都替换掉则需要写成

sed '/s/pattern1/pattern2/g‘ a.txt

最后那个字符‘g'是sed命令中的选项,含义是在每个匹配的输入行中, 将每个模式匹配都作相应的操作. (即 不只局限于第一个匹配)

如果pattern2为空的话,命令就变成了
sed '/s/pattern1//g‘ a.txt
意思是把匹配的项都替换成空。这就在第一次接触这个sed命令的人看起来,结果好像是把匹配的都被删除了,还以为//g是sed命令中的某个代表删除的选项。

其实我想说的是,希望那些高手在回答像我们刚接触Linux,两眼发黑啥都不懂的人问题时,请耐心一点,针对问题能多几句解释说明,不要泛泛的回答什么找man。我在发贴前就已经大概查了下man,我英文不好,三级都是很勉强的才过,所以只能借助字典大概的看了看。给出的答案即使是英文也没关系,但不要空谈。就算自己去找,也得有个大概的范围吧?我想发个问题如有人能解释一下原因也可以节约很多时间啊,得出答案后也会再对照man相关的条目看一看也不错。如果我说的过火,请那些高手不要在意。 ^_^!
汗,可不就是我5楼的回答。。。。
poet
帖子: 2841
注册时间: 2006-09-11 22:47
送出感谢: 0
接收感谢: 4 次

Re: 求一正则表达式的解释

#12

帖子 poet » 2008-12-04 19:42

Dic4000 写了:
xyywll 写了:// 表示删除
其实我想说的是,希望那些高手在回答像我们刚接触Linux,两眼发黑啥都不懂的人问题时,请耐心一点,针对问题能多几句解释说明,不要泛泛的回答什么找man。我在发贴前就已经大概查了下man,我英文不好,三级都是很勉强的才过,所以只能借助字典大概的看了看。给出的答案即使是英文也没关系,但不要空谈。就算自己去找,也得有个大概的范围吧?我想发个问题如有人能解释一下原因也可以节约很多时间啊,得出答案后也会再对照man相关的条目看一看也不错。如果我说的过火,请那些高手不要在意。 ^_^!
命令的含义很清楚了,man也很清楚,这段话与英文能力有很大关系么?

你 man 一下 sed,往下翻一点,就这里,第一行就明白了,后面那么一大段不用看

s/regexp/replacement/
Attempt to match regexp against the pattern space. If successful, replace that portion
matched with replacement. The replacement may contain the special character & to refer
to that portion of the pattern space which matched, and the special escapes \1 through
\9 to refer to the corresponding matching sub-expressions in the regexp.

不管是高手或者什么的,不可能把 man 全看懂再去做事情,那样什么都做不了了,而且大多数人英文没到那个程度,可问题是如果只是了解命令的基本使用,对 man 只需要把分节出来的每个标题瞟看一下就足够,根本没有必要把大段的文字看懂。——这根本不是英文能力问题,是检索自己所需要的信息的问题。
回复

回到 “Shell脚本”