如何从包含电子邮件地址的文本文件中删除每行的域部分

如何从包含电子邮件地址的文本文件中删除每行的域部分

我有一个文本文件,每行一个电子邮件地址。如何删除每行的域部分但不删除 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 解释

/(@).*\.(.*)$/

  • 第一个捕获组 ( @)

    @与字符@逐字匹配

  • .*匹配任意字符(换行符除外)

    量词:*零次至无限次之间,尽可能多次,根据需要返回 [贪婪]

    \.与字符.逐字匹配

  • 第二捕获组 ( .*)

    .*匹配任意字符(换行符除外)

    量词:*零次至无限次之间,尽可能多次,根据需要返回 [贪婪]

  • $断言字符串末尾的位置

正则表达式可视化

Debuggex 演示

答案3

awk可以这样做

$awk '{ sub(/\@.*\./,"@"); print }' file


foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk

使用subSubstitute(查找和替换),您可以搜索模式并替换。

相关内容