如何grep信息?

时间:2016-08-29 17:26:15

标签: shell grep

我有什么:

test
more text
@user653434 text and so


test
more text
@user9659333 text and so

我想过滤此文本,最后将以下列表作为.txt文件:

user653434
user9659333

获取没有“@”符号的名称非常重要。 求助;)

2 个答案:

答案 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

$ 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

请参阅:The Stack Overflow Regular Expressions FAQ