使用sed提取电子邮件地址

时间:2013-07-23 14:53:05

标签: linux bash sed

我正试图通过以下格式从输入中提取电子邮件地址来熟悉sed

something_from.someone:user@email.com

这是我发送给sed的输入,我正在尝试删除所有内容,包括:

sed 'd/[[alphanum:]]+[.][[:alphanum:]]+[:]//'

根据我的研究,这应该这样做,但我收到了这个错误:

sed: 1: "d/[[:alphanum:]]+[.][[: ...": extra characters at the end of d command

关于我做错了什么的任何想法?

1 个答案:

答案 0 :(得分:4)

您的删除语法不正确。要在sed中删除,您需要执行以下操作:

sed '(separator) [pattern to delete](separator)d'

因此,例如:

sed -e '/regex/d' infile

这通常用于删除整行。你要做的是保留一部分线,这样你就需要捕获和替换:

sed -e  's/regex-to-drop\(regex-to-keep\)/\1/g' input-file

''是代替和'是全局的,\( \)是在\1是我希望捕获的东西去的地方捕获的内容。如果我有一系列被捕获的物品,

\(something\)\(something_else\)

我可以通过简单地将以下内容放在sed命令的替换部分中,用它们之间的另一个字符重现它们:

\1 ;; \2

这将产生:something ;; something_else,并且完全如下:

sed -e 's/\(something\)\(something_else\)/\1 ;; \2/g' input-file

在您的情况下,看起来您想要删除冒号前的所有内容:

sed -e 's/^.*:\(.*\)$/\1/g' input-file

@fedorqui建议

脚注以上内容:

Sed使用标准的正则表达式来表示一行的开头和结尾,所以" ^"指的是行的开头和" $"指的是行尾。因此,对上述内容的完整解释如下:

's/^.*: 

从一行开始到结肠的所有内容(" s"表示我们正在设置一个'替换'命令)。

然后:

\(.*\)$/ 

将所有内容捕获到行尾,

/\1/g'

用捕获的项替换WHOLE行。全局(对整个文件)。