我想通过shell脚本打印整个地址的名称。所以user1@12.12.23.234应该给出输出"user1",类似地,11234@12.123.12.23应该给出输出11234
从终端读取:
$ 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
使用 bash 就地编辑:
EMAIL='user@server.com'
echo "${EMAIL%@*}
这是一个内置的 Bash,所以它可能不是很便携(例如,如果它没有链接到/bin/bash
,它就不会与sh
一起运行),但它可能更快,因为它不会分叉一个进程来处理编辑。
使用 sed:
echo "$EMAIL" | sed -e 's/@.*//'
这告诉 sed 替换 @
字符以及它可以在它之后找到的尽可能多的字符,直到行尾,即。 删除@
后的所有内容。
如果您在一个文件中存储了多封电子邮件,则此选项可能会更好,然后您可以执行以下操作
sed -e 's/@.*//' emails.txt > users.txt
希望这有帮助=)
我倾向于使用expr
来做这种事情:
address='user1@12.12.23.234'
expr "$address" : '([^@]*)'
这是expr
的模式匹配和提取功能的用途。翻译过来,上面说:请打印出不包含@
的最长$address
前缀。
expr
工具由 Posix 覆盖,因此它应该非常便携。
请注意,expr
的某些历史版本会将带有前导-
的论点解释为一种选择。如果你关心防止这种情况,你可以在字符串的开头添加一个额外的字母,并避免匹配它,如下所示:
expr "x$address" : 'x([^@]*)'