示例(随机)文本:
[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
,但这里不需要)。