2009-07-25 73 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' 

注意:在選擇模式之前要小心,因爲它會以遞歸方式刪除所有行當前目錄層次結構中的文件:)