我有一个包含以下内容的文件:
./E/domainname.com/martin
./s/domain2.com/shelly
./E/2/4domain.com/john
./X/another.net/gary
我想输出:
martin@domainname.com
shelly@domain2.com
等等。
我一直试图通过在行中向后搜索直到我点击/
来隔离用户名,但到目前为止我都失败了。
答案 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