我有一个文本文件,每行一个电子邮件地址。如何删除每行的域部分但不删除 TLD 部分?在这里,我们将 TLD 定义为最后一个点字符后的字符串的最后一个元素。
换句话说,示例输入:
[email protected]
[email protected]
[email protected]
[email protected]
期望输出:
foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk
答案1
$ sed 's/@.*[.]/@/' file
foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk
正则表达式@.*[.]
捕获从到行上@
最后一个句点的所有内容。我们将其替换为。.
@
答案2
使用perl
perl -pe 's/(@).*\.(.*)$/\1\2/' foo
或内联
perl -i -pe 's/(@).*\.(.*)$/\1\2/' foo
例子
$ cat foo
[email protected]
[email protected]
[email protected]
[email protected]
$ perl -pe 's/(@).*\.(.*)$/\1\2/' foo
foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk
RegEx 解释
/(@).*\.(.*)$/
第一个捕获组 (
@
)@
与字符@
逐字匹配.*
匹配任意字符(换行符除外)量词:
*
零次至无限次之间,尽可能多次,根据需要返回 [贪婪]\.
与字符.
逐字匹配第二捕获组 (
.*
).*
匹配任意字符(换行符除外)量词:
*
零次至无限次之间,尽可能多次,根据需要返回 [贪婪]$
断言字符串末尾的位置
答案3
你awk
可以这样做
$awk '{ sub(/\@.*\./,"@"); print }' file
foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk
使用sub
Substitute(查找和替换),您可以搜索模式并替换。