我必须判断CSV中的列,以找到有效的邮箱并保留它们,同时从该列中删除无效数据.我已经有一个带有简单正则表达式的AWK命令,但一些无效的邮箱没有用它过滤.以下是该命令

awk 'BEGIN{FS=OFS=","}{$1=match($1,/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}/)?substr($1,RSTART,RLENGTH):"";print}'

但我想用与RFC5322兼容的正则表达式替换此正则表达式模式.我找到了下面的正则表达式,但当我将它添加到上面的awk命令中时,它不起作用.请帮我把这个正则表达式模式插入到上面的AWK命令中

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

CSV示例如下

-pedja-@mail.ru,abd
0.5maratonac@gmail.com,534
00dovla.@gmail.com,5rfrf
015.josa@gmail.com,54rf
02142..6584@nadlanu.com,54r4
0616080668.boki@gmail.com,5443
0@0..com,344545
.100.three.7@gmail.com,64
10867249ld@emailgg.xyz,54444

我在指挥部下面试过了

awk 'BEGIN{FS=OFS=","}{$1=match($1,/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}/)?substr($1,RSTART,RLENGTH):"";print}'

预期yields

-pedja-@mail.ru,abd
0.5maratonac@gmail.com,534
,5rfrf
015.josa@gmail.com,54rf
,54r4
0616080668.boki@gmail.com,5443
,344545
,64
10867249ld@emailgg.xyz,54444
john@,4355

(00dovla.@gmail.com,02142..6584@nadlanu.com,0@0..com,.100.three.7@gmail.com,john@) are not valid emails and they are removed)

推荐答案

请帮我把这个正则表达式模式插入到上面的AWK命令中

为了让this regex pattern和你的AWK command一起工作,你必须

  • 通过将两个'分别替换为'\'',在单引号节目文本中嵌入包含的'个引号
  • 删除图案中的全部?:
  • 使用/^…$/将模式锚定到$1的开头和结尾

Linux相关问答推荐

UTF-8输入和使用XGetICValues

在 Linux 中屏蔽文件中的位 - 按位运算

如何在REPL控制台中使用PowerShell将特定的CSV列转换为TitleCase?

如何使用 Linux 命令行跨子目录查找相似的文件名?

Powershell Core,MXLinuxv21,运行 linux /usr/bin/x 命令导致对象命令运行时找不到文件

所有进程的Linux环境变量

docker rm 命令在具有相同操作系统的不同机器上返回不同的状态码

函数在 shell 脚本中抛出错误语法错误:} unexpected

Linux 应用程序分析

适用于 Linux 和 Mac 的 HTTP 调试代理

按主机名的 IPv6 地址

用于 GCC/G++ 的宏来区分 Linux 和 Mac OSX?

你如何在 C 中的 Linux 上进行非阻塞控制台 I/O?

在 C 中设置环境变量

带有 curl 的 Linux 脚本来判断 Web 服务是否已启动

将 CMake 项目导入 Eclipse CDT

为什么`du`的输出通常与`du -b`如此不同

将标准输出作为命令行工具的文件名传递?

Linux下的签名可执行文件

Docker:您是否try 连接到没有 TLS 的启用 TLS 的守护进程?