这是我的难题:
I really like @somecrazytwitterhandle; he's so cool!
@somecrazytwitterhandle is the best! His email is cth1983@gmail.com.
所以起初我以为我需要搜索以下内容- “ \ @ [^ \] *” 但是,这不起作用,因为某些Twitter ID。可以从上一行的开头开始。
那我该如何搜索?我想做这样的事情,但我不知道语法...“ [^ | \] @ [^ \] *”,其中第一个括号是行的开头或结尾处的...。 或在“ @”符号前有一个空格。
答案 0 :(得分:2)
您可以将此grep -o
与tr
一起使用:
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句柄,还将匹配带有数字和下划线的