0

我需要从目录中的大量文本文件列表中删除任何包含某些关键字的行。

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

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

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

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

4

1 回答 1

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 '';
}
于 2013-03-20T02:22:31.647 回答