删除给定模式周围的所有内容

时间:2013-04-15 20:27:09

标签: vim command-line

我有一个文本文件,其中多个列由制表符分隔,数千行如下:

Foo  Bar  foo@bar.com  01.01.0001  SomeMoreStuff

现在我想只提取电子邮件,在这种情况下是foo@bar.com

使用vim或任何其他CLI工具删除电子邮件之前和之后的所有内容最简单的方法是什么?

5 个答案:

答案 0 :(得分:4)

以下命令将打印第三列:

cut -f3 file_name

答案 1 :(得分:1)

使用 awk ;

awk '$0=$3' file

使用纯 vim

试试这一行:

:%s/.*\t\([^@]\+@[^\t]\+\).*/\1/

如果您确定该电子邮件位于第3列,您还可以尝试:

:%s/\v([^\t]*\t){2}([^\t]+).*/\2/

或使用 vim + awk 如果您愿意:)

:%!awk '$0=$3' 

答案 2 :(得分:1)

对于命令行,一个简单的awk将完成这项工作:

awk '{print $3}' inFile

答案 3 :(得分:1)

在Vim中,我将通过使用一个简单的宏来避免出现一个可靠替代的严峻前景。

首先,记录宏:

qq
0
d2f<tab> <-- this is a tab key
f<tab>   <-- this is a tab key
D
q

其次,将下面一行的宏应用到缓冲区的末尾:

:+1,$norm @q

答案 4 :(得分:0)

bash中的

while read -a ARRAY; do echo ${ARRAY[2]}; done < input
在awk-mode中

perl

perl -lane 'print $F[2]' input