将路径操作到电子邮件地址

时间:2014-10-07 13:44:57

标签: unix sed grep

我有一个包含以下内容的文件:

./E/domainname.com/martin    
./s/domain2.com/shelly    
./E/2/4domain.com/john    
./X/another.net/gary

我想输出:

martin@domainname.com    
shelly@domain2.com

等等。

我一直试图通过在行中向后搜索直到我点击/来隔离用户名,但到目前为止我都失败了。

3 个答案:

答案 0 :(得分:5)

您可以尝试以下sed命令。

$ sed 's~.*/\([^/]*\)/\([^/]*\)$~\2@\1~g' file
martin@domainname.com
shelly@domain2.com
john@4domain.com
gary@another.net

<强>解释

  • .*/匹配从开头到/符号的所有字符(距离最后一个正斜杠符号)。
  • \(...\)被称为捕获组,用于捕获角色。
  • [^/]*匹配任何字符,但不匹配/零次或多次。因此,合并的\([^/]*\)将捕获在最后/符号之前存在的所有字符。
  • /匹配最后一个正斜杠。
  • \([^/]*\)将所有字​​符捕获但不是/次或多次捕获到另一个字符组。
  • $表示该行的结尾。
  • 在替换部分中,反向引用已捕获的组,如\1\2将在相应的组内打印字符。

答案 1 :(得分:4)

我会用awk:

awk -F/ '{printf "%s@%s\n",$NF,$(NF-1)}' input.file

-F//标记为字段分隔符。使用$1$3,...您可以访问这些字段。 $0代表完整记录。 NF表示一行中的字段数。知道了这一点,您可以使用$NF选择行中的最后一个字段,使用$(NF-1)选择倒数第二个字段,然后使用@作为分隔符打印它们。

答案 2 :(得分:1)

使用bash builtins(参数扩展):

#!/bin/bash

while read LINE; do
    NAME="${LINE##*/}"
    DOMAIN="${LINE%*/$NAME}"
    DOMAIN="${DOMAIN##*/}"
    echo "$NAME@$DOMAIN"
done < filename

输出:

martin@domainname.com
shelly@domain2.com
john@4domain.com
gary@another.net

sed的另一种选择:

sed -E 's|^.*/(.*)/([^ ]*)|\2@\1|' filename