从Linux中的多个文件中删除文本行

时间:2009-07-25 18:55:58

标签: linux unix command-line

是否有一种简单的方法可以在命令行中从文件夹中删除相同的文本行?

5 个答案:

答案 0 :(得分:46)

如果您的sed版本允许-i.bak标记(就地编辑):

sed -i.bak '/line of text/d' * 

如果没有,只需将其放入bash循环中:

for file in *.txt
do
    sed '/line of text/d' "$file" > "$file".new_file.txt
done

答案 1 :(得分:17)

要查找a pattern并删除the line containing the pattern以下命令,可以使用

find . -name "*" -type f | xargs sed -i -e '/<PATTERN>/d'

示例: 如果您要删除所有sleep个文件中包含单词xml的行

find . -name "*.xml" -type f | xargs sed -i -e '/sleep/d'

注意:在选择模式之前要小心,因为它将在当前目录层次结构的所有文件中递归删除该行:)

答案 2 :(得分:4)

考虑grep -v:

for thefile in *.txt ; do
   grep -v "text to remove" $thefile > $thefile.$$.tmp
   mv $thefile.$$.tmp $thefile
done

grep -v显示除匹配之外的所有行,它们进入临时文件,然后将tmpfile移回旧文件名。

答案 3 :(得分:4)

perl -ni -e 'print if not /mystring/' *

这告诉perl遍历你的文件(-n),就地编辑(-i),如果它与正则表达式不匹配则打印该行。

有点相关,这是一种在多个文件上执行替换的便捷方法。

perl -pi -e 's/something/other/' *

答案 4 :(得分:1)

我为此编写了一个Perl脚本:

#!/usr/bin/perl

use IO::Handle;

my $pat = shift(@ARGV) or
    die("Usage: $0 pattern files\n");
die("Usage $0 pattern files\n")
    unless @ARGV;

foreach my $file (@ARGV) {
    my $io = new IO::Handle;
    open($io, $file) or
        die("Cannot read $file: $!\n");
    my @file = <$io>;
    close($io);
    foreach my $line (@file) {
        if($line =~ /$pat/o) {
            $line = '';
            $found = 1;
            last;
        }
    }
    if($found) {
        open($io, ">$file") or
            die("Cannot write $file: $!\n");
        print $io @file;
        close($io);
    }
}

请注意,它会根据正则表达式删除行。如果您想进行完全匹配,内部foreach将如下所示:

foreach $line (@file) {
    chomp $line;
    if($line eq $pat) {
        $line = '';
        $found = 1;
        last;
    }
}