2009-07-25 21 views

Odpowiedz

36

Jeśli wersja sed umożliwia flagę -i.bak (edycja na miejscu):

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

Jeśli nie, wystarczy umieścić go w pętli bash

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

+1 dla pliku '-i.bak' gsed fu. Twoja 'pętla for' prawdopodobnie potrzebuje pliku' mv $ file.new_file.txt $ ', aby pasowało do niego. – nik

+0

@Robert, Jeśli nie trafisz w sed, możesz jeszcze: 'perl -pi.bak -e 's | linia tekstu || g' \ *' – nik

+0

To pozostawia pustą linię zamiast usuwania linii, prawda ? –

1

Napisałem skrypt Perl dla tego:

#!/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); 
    } 
} 

pamiętać, że usuwa linie oparte na regex. Jeśli chciał zrobić dokładne dopasowanie, wewnętrzna foreach wyglądałby następująco:

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

Rozważmy grep -v:

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

Grep -v pokazuje wszystkie wiersze z wyjątkiem pasujących, przechodzą one do pliku tymczasowego, a następnie plik tmp zostaje przeniesiony z powrotem do starej nazwy pliku.

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

Mówi perla do pętli na pliku (-n), edytować w miejscu (-i) i wydrukować wiersz, jeśli nie pasuje do wyrażenia regularnego.

Poniżej znajduje się przydatny sposób na zastąpienie kilku plików.

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

Z tego [link] (http://www.kuro5hin.org/story/2009/3/9/191744/8407): zarówno perl jak i sed są tradycyjnymi silnikami NFA, więc teoretycznie nie powinny się one znacząco różnić w ich wydajność, ale w rzeczywistości perl ma wiele zastosowań optymalizacyjnych, które sprawiają, że działa dobrze w typowych przypadkach. – stephenmm

6

Aby znaleźć a pattern i usunąć the line containing the pattern poniżej komenda może być użyta

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

Przykład: jeśli chcesz usunąć wiersz zawierający słowo sleep we wszystkich xml plików

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

UWAGA: Przed wybraniem wzoru należy zachować ostrożność, ponieważ spowoduje on rekursywne usunięcie linii pliki w bieżącej hierarchii katalogów :)

Powiązane problemy