是否可以使用 sed -i 从一个文本文件移动到另一个文本文件?

是否可以使用 sed -i 从一个文本文件移动到另一个文本文件?

我正在我的 Debian 机器上编写一个 shell 脚本,脚本中有一行需要从充满电子邮件的文本文件中删除一些电子邮件,如下所示:

sed -i '/[email protected]\|[email protected]\|[email protected]/d' /myfolder/my_email_list.txt

此命令有效,但是由于此列表变得有点大,我在想是否有办法将我想要 sed 删除的所有电子邮件存储在列表(文本文件)中,因为当我需要添加新电子邮件时,我只需编辑列表,而不是编辑脚本并将其包含在表达式中。

这样的事能做到吗?

答案1

可能有一种本地执行此操作的方法,sed但这里还有一些其他选项:

  1. grep

    grep -vFf badmails.txt my_email_list.txt > tempfile && 
      mv tempfile my_email_list.txt
    

    在这里,你给出了要搜索的grep模式列表 ( -f),告诉它将它们视为简单字符串 ( -F),并要求那些符合条件的行不是( -v) 匹配其中任何一个。最后,将输出重定向到临时文件,然后重命名该文件以覆盖原始文件。

  2. 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{$_}))中定义了相应的值

  3. 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 
    

相关内容