仅适用于小写电子邮件地址

仅适用于小写电子邮件地址

示例(随机)文本:

[email protected]:Portuguesa-Span103
[email protected]
[email protected]:Sanchismo103

期望的输出:

[email protected]:Portuguesa-Span103
[email protected]
[email protected]:Sanchismo103

一般来说,这是我倾向于使用的电子邮件地址正则表达式,

[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}

我希望该命令查找所有电子邮件地址并简单地将它们小写,无论每行的格式如何。同时仍然保持该行其余部分的正常大写(除了电子邮件地址之外没有其他任何更改)。

我首选的使用工具是 bash (以及相关工具),我目前还没有尝试自己这样做,因为我不知道从哪里开始。

我正在使用 Gnu/Cygwin。

答案1

当您使用 GNU sed 时,您可以使用:

sed -e 's/^\([^@]*\)@/\L\1@/' file

这会将从行首到第一个的所有内容转换@为小写。例如

$ sed -e 's/^\([^@]*\)@/\L\1@/' input.txt
[email protected]:Portuguesa-Span103
[email protected]
[email protected]:Sanchismo103

如果电子邮件地址不在每行的开头,和/或如果一行上可能有多个电子邮件地址,则您可以使用\b而不是^将搜索和替换锚定到单词边界标记而不是开始位置线路:

sed -e 's/\b\([^@]*\)@/\L\1@/g' input.txt

答案2

如果您使用的正则表达式始终正确,您可以将其与 Perl 一起使用:

% perl -pe 's/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}/\L$&/' foo
[email protected]:Portuguesa-Span103
[email protected]
[email protected]:Sanchismo103

$&是匹配的文本,并将\L其后面的所有内容变为小写(直到 a \E,但这里不需要)。

相关内容