如何使用grep从文件中获取Skype用户名?

时间:2014-08-07 03:10:27

标签: regex linux shell grep

我想从网页导出Skype ID,数据如下:

contact skype:youarefriend"

我只想在结果中导出youarefriend。我可以用:

grep -oP 'skype:.*?"'

但结果是skype:youarefriend"。我可以在没有skype:前缀的情况下获得输出吗?

4 个答案:

答案 0 :(得分:5)

如果你有Perl正则表达式(如果你使用的是-P),那么使用lookbehind排除skype:和前瞻以排除"

grep -oP '(?<=skype:).*?(?=")'

示例:

$ echo 'help "skype:someone" else "hi there"' | grep -oP '(?<=skype:).*?(?=")'
someone
$

答案 1 :(得分:4)

您可以使用escape sequence \K。这个漂亮的序列做的是重置报告的匹配的起点。任何先前匹配的字符都不包含在最终匹配的序列中:

grep -oP "skype:\K\w+" file

positive lookbehind断言。这样看后面是否有skype:,如果是,则匹配单词(\w+):

grep -oP "(?<=skype:)\w+" file

如果要在"之前捕获所有内容,可以使用以下正则表达式。与之前的正则表达式类似,后面会查看是否有skype:,如果是,则匹配另外一个不是"的字符(基本上是第一次出现{{1}之前的所有字符) }):

"

如果您想更具体,并且仅匹配valid Skype usernames(必须以字母开头,只能包含字母,数字和标点符号grep -oP '(?<=skype:)[^"]+' file .._),您可以使用:

-

(如果您一直想知道为什么正则表达式中没有grep -ioP "(?<=skype:)[a-z][\w.,-]{6,32}" file ,那是因为_也包含\w;它是一个简写表示字符类_。{grep}命令中的[a-zA-Z0-9_]选项用于正则表达式和输入文件中的 i gnore大小写区别。)

答案 2 :(得分:1)

另一种形式:

grep -oP '(?<=skype:)[^"]+' file

答案 3 :(得分:1)

您也可以精确地找出您想要匹配的正则表达式中可能的字符。即Skype usernames只能有字母,数字,句号,逗号,破折号或下划线。

$ grep -oP "(?<=skype:)[a-zA-Z][a-zA-Z|0-9|,|\-|_|\.]+" <<<"contact skype:s0me,we-ird_n.ame\""
s0me,we-ird_n.ame

请注意,这与Skype要求的非字母开头不匹配。