批量删除包含某些单词的行?

时间:2013-03-20 01:30:12

标签: command-line command

我需要从目录中的大量文本文件中删除包含其中某些关键字的所有行。

例如,我需要删除其中包含任何这些关键字的所有行:test1,example4,coding9

这是我能找到的最接近的例子:

sed '/Unix\|Linux/d' *.txt

注意:这些行不需要包含要删除的所有关键字,只需删除一行:)

1 个答案:

答案 0 :(得分:0)

看起来您正在寻找一些1个衬管命令来读取和写回数千个文件和数百万行。我不会这样做,因为我更喜欢在Perl中编写一个快速而脏的脚本。我非常简单地在非常简单的文件上对它进行了测试,但是由于你正在处理成千上万的文件和数百万行,我会先测试你在测试目录中编写的一些文件,以便你可以验证。

#!/usr/bin/perl

# the initial directory to read from
my $directory = 'tmp';
opendir (DIR, $directory) or die $!;

my @keywords = ('woohoo', 'blah');

while (my $file = readdir(DIR)) {

    # ignore files that begin with a period
    next if ($file =~ m/^\./);

    # open the file
    open F, $directory.'/'.$file || die $!;
    # initialize empty file_lines
    @file_lines = ();

    # role through and push the line into the new array if no keywords are found
    while (<F>) {
        next if checkForKeyword($_);
        push @file_lines, $_;
    }
    close F;

    # save in a temporary file for testing
    # just change these 2 variables to fit your needs
    $save_directory = $directory.'-save';
    $save_file = $file.'-tmp.txt';
    if (! -d $save_directory) {
        `mkdir $save_directory`;
    }
    $new_file = $save_directory.'/'.$save_file;
    open S, ">$new_file" || die $!;
    print S for @file_lines;
    close S;
}

# role through each keyword and return 1 if found, return '' if not
sub checkForKeyword()
{
     $line = shift;
     for (0 .. $#keywords) {
         $k = $keywords[$_];
         if ($line =~ m/$k/) {
           return 1;
         }
     }
     return '';
}