我正在我的 Debian 机器上编写一个 shell 脚本,脚本中有一行需要从充满电子邮件的文本文件中删除一些电子邮件,如下所示:
sed -i '/[email protected]\|[email protected]\|[email protected]/d' /myfolder/my_email_list.txt
此命令有效,但是由于此列表变得有点大,我在想是否有办法将我想要 sed 删除的所有电子邮件存储在列表(文本文件)中,因为当我需要添加新电子邮件时,我只需编辑列表,而不是编辑脚本并将其包含在表达式中。
这样的事能做到吗?
答案1
可能有一种本地执行此操作的方法,sed
但这里还有一些其他选项:
grep
grep -vFf badmails.txt my_email_list.txt > tempfile && mv tempfile my_email_list.txt
在这里,你给出了要搜索的
grep
模式列表 (-f
),告诉它将它们视为简单字符串 (-F
),并要求那些符合条件的行不是(-v
) 匹配其中任何一个。最后,将输出重定向到临时文件,然后重命名该文件以覆盖原始文件。Perl
perl -i -e 'open($f,"badmails.txt"); map{$k{$_}++}<$f>; while(<>){print unless defined($k{$_})}' my_email_list.txt
这将打开
badmails.txt
,并将每一行保存为哈希,然后遍历my_email_list.txt
(while(<>){}
) 的每一行并打印它,除非 中存在相同的行(电子邮件)badmails.txt
,即除非在哈希 (print unless defined($k{$_})
)中定义了相应的值sed
和外壳:while read badmail; do sed -i sed -i "/$badmail/d" my_email_list.txt ; done < badmails.txt
或者,使用 shell 构建要删除的邮件列表,例如,将其传递给:
[email protected]\|[email protected]
sed
bad=$(while read b; do printf "%s\|" "$b"; done < badmails.txt| sed 's/\\|$//') sed -i "/$bad/d" my_email_list.txt