【问题标题】:How to get Skype usernames from a file using grep?如何使用 grep 从文件中获取 Skype 用户名?
【发布时间】:2014-08-07 03:10:27
【问题描述】:

我想从网页中导出一个Skype ID,数据是这样的:

contact skype:youarefriend"

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

grep -oP 'skype:.*?"'

但结果是skype:youarefriend"。我可以得到不带skype: 前缀的输出吗?

【问题讨论】:

  • .*? 不是一个有意义的表达式,相当于一个空表达式。你的意思是.*?"
  • @ooga:它 (.*?) 是一个非贪婪的正则表达式。
  • perl -ne 'print $1 if m/skype:(\w+)/;' file
  • @ooga:要么半睡半醒,要么根​​本不知道非贪婪匹配。请参阅“正则表达式”下的perldoc perlre,尤其是量词小节。
  • @ooga : 我想在第一次出现的时候停下来

标签: regex linux shell grep


【解决方案1】:

如果您有 Perl 正则表达式(就像您使用 -P 一样),则使用后向排除 skype: 并使用前瞻排除 "

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

例子:

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

【讨论】:

  • 它仍然在结果中得到“:youarefriend”
【解决方案2】:

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

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

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

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

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

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

如果您想更具体,仅匹配valid Skype usernames(必须以字母开头,只能包含字母、数字和标点符号.._ 和@987654337 @),你可以使用这个:

grep -ioP "(?<=skype:)[a-z][\w.,-]{6,32}" file

(如果您一直想知道为什么正则表达式中没有_,那是因为\w 也包含_;它是字符类[a-zA-Z0-9_] 的简写表示。 -i 选项在 grep 命令中用于i忽略正则表达式和输入文件中的大小写区别。)

【讨论】:

  • 非常好!我从来不知道grep 可以做到这一点。我通常会联系sed 来做这样的事情
  • 我不太清楚你的 "grep -oP "skype:\K(\w+)" 文件",你能解释一下:(\w+)
  • \K 重置报告匹配的起点,并且不再包括任何以前使用的字符。 (例如,扔掉它匹配到那个点的所有东西。)
  • @YOU: \w+ 是一个或多个“单词”字符的序列,表示字母数字或下划线。
  • 你的回答很好,但我怎么还能得到一些特殊字符,比如“?” ,并停在指定的字符处。
【解决方案3】:

另一种形式:

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

【讨论】:

  • @YOU (?&lt;=skype:) 是每个人都在说的后视断言。 [^"]+ 匹配任何不是 (^) " 的字符。
【解决方案4】:

您还可以准确地找出您想要匹配的正则表达式中可能存在的字符。即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 要求中以非字母开头的任何内容都不匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 2017-01-05
    相关资源
    最近更新 更多