如何使用grep从文本文件中找到所有Twitter句柄?

时间:2018-09-24 15:16:56

标签: regex

这是我的难题:

I really like @somecrazytwitterhandle; he's so cool!
@somecrazytwitterhandle is the best! His email is cth1983@gmail.com.

所以起初我以为我需要搜索以下内容- “ \ @ [^ \] *” 但是,这不起作用,因为某些Twitter ID。可以从上一行的开头开始。

那我该如何搜索?我想做这样的事情,但我不知道语法...“ [^ | \] @ [^ \] *”,其中第一个括号是行的开头或结尾处的...。 在“ @”符号前有一个空格。

3 个答案:

答案 0 :(得分:2)

您可以将此grep -otr一起使用:

grep -oE '(^|[[:blank:]])@[[:alnum:]_]+' f | tr -d '[[:blank:]]'

@somecrazytwitterhandle
@somecrazytwitterhandle
  • 正则表达式@[[:alnum:]_]+与以@开头且后跟1个以上单词字符的文本匹配。
  • tr -d '[[:blank:]]'从输出中剥离所有空格

答案 1 :(得分:1)

您可以将PCRE regex与GNU grep一起使用,如下所示:

grep -Po '(?<!\S)@\w+' file

P选项启用PCRE regex引擎,而o使其仅返回匹配的文本。

后面的(?<!\S)否定性查找确保当前位置左侧紧邻字符串的开头或空白。

@\w+将匹配@,然后匹配1个以上的字母,数字或_

请参见online grep demo

s="I really like @somecrazytwitterhandle; he's so cool!
@somecrazytwitterhandle is the best!"
grep -Po '(?<!\S)@\w+' <<< "$s"

输出:

@somecrazytwitterhandle
@somecrazytwitterhandle

替代解决方案是使用\B

grep -Po '\B@\w+' <<< "$s"

请参见this online demo\B是单词边界以外的位置,并且@必须以非单词char或字符串开头开头。

答案 2 :(得分:0)

@[\w]*?(?=[^\w])将匹配Twitter句柄,还将匹配带有数字和下划线的