2

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

something_from.someone:user@email.com

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

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

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

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

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

4

1 回答 1

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

's' 是替代品,'g' 是全球性的,\( \)这是捕获的内容,而这\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'

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

于 2013-07-23T15:16:06.160 回答