我正在编写一个 bash 脚本,它接受 CSV 文件列表作为参数,并输出仅在第一个文件中找到的电子邮件地址。为了实现此目的,对于第一个 CSV 文件中的每条记录,我查找电子邮件地址字段并将其内容读入 shell 变量中。然后,我使用grep -iE
以下正则表达式来查找刚刚在所有剩余文件中找到的电子邮件地址,确保它不是子字符串(例如[电子邮件受保护]不等于[电子邮件受保护]),并允许它位于记录的开头或结尾:
"^(.*,)?($EMAIL_ADDRESS|\"$EMAIL_ADDRESS\")(,.*)?\$"
这种方法的一个问题是电子邮件地址包含在正则表达式中具有特殊含义的点。我的问题是:
- 如何以优雅的方式避免这个问题?
- 在更一般的情况下,例如当要查找的值不是电子邮件地址而是一些自由文本并且可能还包含其他特殊字符时,如何避免此问题?
答案1
在 Perl regexp ( grep -P ...
) 中,您可以使用\Q...\E
它来保护元字符
grep -P "(^|,)\Q$EMAIL\E(,|$)" file.csv
在哪里:
(^|,)
= 字段开始(,|$)
= 字段结束