从Linux的多个文件中删除文本的行(Remove line of text from multip

2019-06-26 18:58发布

有一个简单的方法,从在命令行全文文档的文件夹中删除文本的同一行?

Answer 1:

如果您的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


Answer 2:

为了找到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'

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



Answer 3:

考虑的grep -v:

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

grep的-v显示除了那些匹配的所有行,他们进入一个临时文件,然后将TMPFILE移回旧的文件名。



Answer 4:

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

这告诉Perl来遍历文件(-n),编辑到位(-i),并打印行,如果它不符合您的正则表达式。

有点相关,这里是在几个文件进行替换的便捷方式。

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


Answer 5:

我写了一个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;
    }
}


文章来源: Remove line of text from multiple files in Linux