-1

我想通过 shell 脚本从整个地址打印名称。所以 user1@12.12.23.234 应该给出输出“user1”,同样 11234@12.123.12.23 应该给出输出 11234

4

3 回答 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 回答