2009-07-25 109 views

回答

36

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

对于`-i.bak` gsed fu +1。你的`for循环`可能需要一个`mv $ file.new_file.txt $ file`来匹配它。 – nik 2009-07-25 19:10:57

+0

@Robert,如果你错过了右边的sed,你仍然可以这样做:`perl -pi.bak -e'| | g'\ *` – nik 2009-07-25 19:12:53

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; 
    } 
} 
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
perl -ni -e 'print if not /mystring/' * 

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

有点相关,这里有一个方便的方法来执行几个文件的替换。

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

要找到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' 

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