我想从网页导出Skype ID,数据如下:
contact skype:youarefriend"
我只想在结果中导出youarefriend
。我可以用:
grep -oP 'skype:.*?"'
但结果是skype:youarefriend"
。我可以在没有skype:
前缀的情况下获得输出吗?
答案 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要求的非字母开头不匹配。