Board logo

标题: [问题求助] 有条sed命令不清楚,求解释 [打印本页]

作者: wangb70    时间: 2013-7-30 12:09     标题: 有条sed命令不清楚,求解释

我曾经问过一个sed方面的问题,见原贴:
http://bbs.bathome.net/thread-25483-1-1.html

这里为了方便,我再把文本发下,
[email]Mehak@gmail.com[/email] | Facebook
    https://www.facebook.com/pages/Mehakgmailcom/248181861872358?
    [email]Mehak@gmail.com[/email]. University. 9 people like this. Want to like this page? Sign up for Facebook to get started. Sign Up. It's free and anyone can join. Already a ...
    Team Drake and Kennedy ([email]drakeandkennedy@gmail.com[/email] ...
    https://www.facebook.com/TeamDrakeAndKennedy?
    Team Drake and Kennedy ([email]drakeandkennedy@gmail.com[/email]). 1120 likes · 374 talking about this. Drake and Kennedy's journey into this world has been a ...
    [email]Alice.williams.com@gmail.com[/email] | Facebook
    https://www.facebook.com/.../Alicewilliamscomgmailcom/31452919192...?
    [email]Alice.williams.com@gmail.com[/email]. 7 likes · 0 talking about this.
    [email]sadia22222@gmail.com[/email] - Sadia Sabreen Shammee | Facebook
    https://www.facebook.com/permalink.php?story_fbid...id...?
    Flamboyant Nayeem, Jumon Ahmed, Maruf Hasan and 39 others like this. 48 of 355. View previous comments. Muhammad Kashif 03216663232 my number ...
    [email]Macharla.mallikarjun@gmail.com[/email] | Facebook
    https://www.facebook.com/Macharlamallikarjungmailcom?
    [email]Macharla.mallikarjun@gmail.com[/email]. 4 likes · 0 talking about this.
    [email]HOGER.EVENTOS@GMAIL.COM[/email] | Facebook
    https://www.facebook.com/.../HOGEREVENTOSGMAILCOM/2733076...?
    [email]HOGER.EVENTOS@GMAIL.COM[/email]. 11 likes · 0 talking about this.
    [email]Abdulwahab@Gmail..com[/email] - Local Business | Facebook
    https://www.facebook.com/.../AbdulwahabGmailcom/211068888974266?
    [email]Abdulwahab@Gmail..com[/email]. 17 likes · 0 talking about this · 13 checkins.
    www.gmail.com - Photos | Facebook
    https://www.facebook.com/pages/wwwgmailcom/162880424899?sk...?
    www.gmail.com, Las Mercedes, Venezuela. 69204 likes · 998 talking about this.
    Gmail.com | Facebook
    https://www.facebook.com/www.gmail.com.email?
    www.gmail.com - Gmail has become one of the best used web based email service in the world for both personal and professional use. You can access Gmail ...
    Bappa CHI Kheti at Gmail.com | Facebook
    https://www.facebook.com/BappaChiKhetiAtGmailcom?
    Bappa CHI Kheti at Gmail.com. 4 likes · 0 talking about this.
排除 www.gmail.com不要,只要真正的gmail邮箱地址.

其中,terse给出了一个sed命令:
sed -nr "s/.*[ (](.*@gmail[\.]+com).*/\1/ip" "a.txt"
好用,我很希望自己能完全看懂它,为此查了一些资料,下面说出我的理解,不知道对不对,大家帮助看看.
   1             -r这个参数,不用-r的话, | & + 要转义的,
                   -r是对正则的扩展。当你表示一个以上的空格和tab时候的加号,用 -r的时候加号直接跟在[]后面,而不使用-r时候 加号前得加上\

   2           .*意味着能够匹配任意数量的任何字符
   3           命令中.*后面的[ (]的理解,,查了下是这样说的:
          如果不是在字符组‘[]’限定的范围内,括号在正则表达式里面是元字符,它本身不会去匹配

字符。如果要使用括号匹配字符,需要转义,也就是使用'\('和'\)'。
   b.在字符组'[]'限定范围内,括号是被当作普通字符的。就是说,如果你写一个正则表达式像这

样: '[.()abc]',它代表匹配一个字符,这个字符可以是 . ( ) a b c中的任意一个。注意其中的括

号没有转义,因为正则表达式中‘[]’比较特殊。
   
还是不懂啊,谁能再通俗的说说.

   4  然后是这个小括号,括号在正则表达式中代表一个子表达式。比如,‘(abc|efg)kkk’ 这个正则表达式可以匹配

abckkk和 efgkkk.
   括号在正则表达式中又叫“捕获型括号”,在perl这类流派所支持的正则表达式中,后续可以

使用$1、$2这样的变量来引用括号内的表达式。而在egrep中,也可以通过'\1'这样的元字符序列来引

用它,这里terse是如何使用这个小括号的?

   5 加号是不是匹配1或多个正好在它之前的那个点,网址中的.

  6 这里的\1,好象是引用,但具体怎么回事,哪位费心来说说.

  7  p前面的!,"!"表示后边的命令对所有没有
被选定的行发生作用,这里是这样理解吗?
  这里写了一些不懂的地方,希望大家多指出错误,帮助象我一样的新手提高,当然跟希望terse能亲自讲解,这里先谢谢大家了.
作者: Python    时间: 2013-7-30 12:30

5 加号是不是匹配1或多个正好在它之前的那个点,网址中的.

是的

6 这里的\1,好象是引用,但具体怎么回事,哪位费心来说说.

后向引用,配合前面的()使用的,参考:
http://bbs.chinaunix.net/thread-605570-1-1.html

7  p前面的!,"!"表示后边的命令对所有没有

p表示print,!p表示not print
不过我看人家写的是字母i,你怎么说是感叹号呢?
作者: wangb70    时间: 2013-7-31 08:34

本帖最后由 wangb70 于 2013-7-31 08:57 编辑

回复 2# Python


    谢谢python,好象明白一点了,就是用(.*@gmail[\.]+com)通过\1的后向引用,替换整行,是这样吗?
命令中的.*[ (],特别是(,怎么括号只有一半,想匹配什么,最不明白的就是这一部分.

我把字母i当成了感叹号,不好意思.


  于 Regular Expression 中使用 `` \(''``{ \)}''来括住一部分的 Regular Expression; 其后可用 `` \1'''来表示第一次被`` \('' `` \)'' 括住的部份. 若 Regular Expression 中使用了数次`` \('' `` \)'' 来括住不同的部分, 则依次使用 ``\1'', `` \2'', `` \3'' ,...(最多可用到 `` \9'')来 表示之前括住的 Regular Expression

问题是,在原命令中,.*[ (]或者是(.*@gmail[\.]+com),这两部分与上文比较,看这里"若 Regular Expression 中使用了数次`` \('' `` \)'' 来括住不同的部分",完全没有反斜杠\和小括号(,也没有看到\(,而是中括号[ (],包含半个小括号.
我意思是说,不满足后向引用的条件,没有"使用了数次`` \('' `` \)'' 来括住不同的部分",
糊涂了,不说了
作者: gawk    时间: 2013-7-31 08:41

回复 3# wangb70


    匹配的是@gmail前面那个左括号




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2