我想通过 shell 脚本从整个地址打印名称。所以 user1@12.12.23.234 应该给出输出“user1”,同样 11234@12.123.12.23 应该给出输出 11234
问问题
101 次
3 回答
5
从终端读取:
$ IFS=@ read user host && echo "$user"
<user1@12.12.23.234>
user1
从变量中读取:
$ address='user1@12.12.23.234'
$ cut -d@ -f1 <<< "$address"
user1
$ sed 's/@.*//' <<< "$address"
user1
$ awk -F@ '{print $1}' <<< "$address"
user1
于 2012-10-10T21:20:47.960 回答
4
使用 bash 就地编辑:
EMAIL='user@server.com'
echo "${EMAIL%@*}
这是一个内置的 Bash,所以它可能不是很便携(例如,sh
如果它没有链接到它,它就不会运行/bin/bash
),但它可能更快,因为它没有派生处理编辑的进程。
使用 sed:
echo "$EMAIL" | sed -e 's/@.*//'
这告诉 sed 替换@
字符以及它可以在它之后找到的尽可能多的字符,直到行尾什么都没有,即。删除之后的所有内容@
。
如果您将多封电子邮件存储在一个文件中,此选项可能会更好,然后您可以执行类似的操作
sed -e 's/@.*//' emails.txt > users.txt
希望这会有所帮助=)
于 2012-10-10T21:26:31.003 回答
0
我倾向于使用expr
这种东西:
address='user1@12.12.23.234'
expr "$address" : '\([^@]*\)'
这是expr
其模式匹配和提取能力的用途。翻译过来,上面说:请打印出$address
不包含@
.
Posix 涵盖了该expr
工具,因此它应该非常便携。
需要注意的是,一些历史版本expr
将解释带有前导的参数-
作为选项。如果您关心防止这种情况,您可以在字符串的开头添加一个额外的字母,并避免匹配它,如下所示:
expr "x$address" : 'x\([^@]*\)'
于 2012-10-10T22:11:00.820 回答