使用 sed 提取电子邮件地址

hax*_*ode 2 linux bash sed

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

something_from.someone:user@email.com

这是我发送到的输入sed,我试图删除所有内容,包括:

sed 'd/[[alphanum:]]+[.][[:alphanum:]]+[:]//'
Run Code Online (Sandbox Code Playgroud)

根据我的研究,这应该可以做到,但我收到此错误:

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

关于我做错了什么有什么想法吗?

ere*_*wok 5

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

sed '(separator) [pattern to delete](separator)d'
Run Code Online (Sandbox Code Playgroud)

因此,例如:

sed -e '/regex/d' infile
Run Code Online (Sandbox Code Playgroud)

这通常用于删除整行。相反,您想要做的是保留该行的某些部分,因此您需要捕获并替换:

sed -e  's/regex-to-drop\(regex-to-keep\)/\1/g' input-file
Run Code Online (Sandbox Code Playgroud)

's' 代表替代,'g' 代表全局,the 是\( \)捕获的内容,而 the\1是我希望捕获的内容所在的位置。如果我有一系列捕获的物品,

\(something\)\(something_else\)
Run Code Online (Sandbox Code Playgroud)

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

\1 ;; \2
Run Code Online (Sandbox Code Playgroud)

这将产生:something ;; something_else并且总共看起来像:

sed -e 's/\(something\)\(something_else\)/\1 ;; \2/g' input-file
Run Code Online (Sandbox Code Playgroud)

就您而言,您似乎想删除冒号之前的所有内容:

sed -e 's/^.*:\(.*\)$/\1/g' input-file
Run Code Online (Sandbox Code Playgroud)

根据 @fedorqui 建议的上述脚注:

Sed 使用标准正则表达式表示法来引用行的开头和结尾,因此“^”表示行的开头,“$”表示行的结尾。因此,上述内容的完整解释如下:

's/^.*: 
Run Code Online (Sandbox Code Playgroud)

从行首到冒号的所有内容(“s”表示我们正在设置“替换”命令)。

然后:

\(.*\)$/ 
Run Code Online (Sandbox Code Playgroud)

捕捉到该行末尾的所有内容,并且

/\1/g'
Run Code Online (Sandbox Code Playgroud)

将整个行替换为捕获的项目。全局执行此操作(针对整个文件)。