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
关于我做错了什么有什么想法吗?
您的删除语法不正确。要在 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)
将整个行替换为捕获的项目。全局执行此操作(针对整个文件)。