我正试图通过以下格式从输入中提取电子邮件地址来熟悉sed
:
something_from.someone:user@email.com
这是我发送给sed
的输入,我正在尝试删除所有内容,包括:
:
sed 'd/[[alphanum:]]+[.][[:alphanum:]]+[:]//'
根据我的研究,这应该这样做,但我收到了这个错误:
sed: 1: "d/[[:alphanum:]]+[.][[: ...": extra characters at the end of d command
关于我做错了什么的任何想法?
答案 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
脚注以上内容:
Sed使用标准的正则表达式来表示一行的开头和结尾,所以" ^"指的是行的开头和" $"指的是行尾。因此,对上述内容的完整解释如下:
's/^.*:
从一行开始到结肠的所有内容(" s"表示我们正在设置一个'替换'命令)。
然后:
\(.*\)$/
将所有内容捕获到行尾,
/\1/g'
用捕获的项替换WHOLE行。全局(对整个文件)。