我有什么:
test
more text
@user653434 text and so
test
more text
@user9659333 text and so
我想过滤此文本,最后将以下列表作为.txt文件:
user653434
user9659333
获取没有“@”符号的名称非常重要。 求助;)
答案 0 :(得分:3)
使用grep -P
(需要GNU grep
):
$ grep -oP '(?<=@)\w+' File
user653434
user9659333
-o
告诉grep只打印匹配。
-P
告诉grep使用Perl风格的正则表达式。
(?<=@)
告诉sed @
必须在比赛之前,但@
不包含在比赛中。
\w+
匹配一个或多个单词字符。这就是grep将要打印的内容。
使用grep
更改文件:
grep -oP '(?<=@)\w+' File >tmp && mv tmp File
$ sed -En 's/^@([[:alnum:]]+).*/\1/p' File
user653434
user9659333
并且,要更改文件:
sed -En -i.bak 's/^@([[:alnum:]]+).*/\1/p' File
-E
告诉sed使用扩展形式的正则表达式。这减少了使用转义的需要。
-n
告诉sed除非我们明确要求,否则不要打印任何内容。
-i.bak
告诉sed在保留扩展名为.bak
的备份文件时更改文件。
s
中的前导s/^@([[:alnum:]]+).*/\1/p
告诉sed我们正在使用替换命令。该命令具有典型形式s/old/new/
,其中old
是正则表达式,sed将old
替换为new
。尾随p
是替换命令的一个选项:p
告诉sed打印结果行。
在我们的例子中,old
部分是^@([[:alnum:]]+).*
。从该行的开头^
开始,匹配@
后跟一个或多个字母数字字符([[:alnum:]]+)
,后跟任何内容.*
。由于字母数字字符放在parens中,因此会将其另存为一组,标记为\1
。
替换命令的new
部分只是\1
,上面的字母数字字符包含用户名。
此处,s
表示我们正在使用sed 替换命令。通常的形式
答案 1 :(得分:2)
使用GNU grep:
grep -Po '^@\K[^ ]*' file
输出:
user653434 user9659333