2009-07-25 23 views

Respuesta

36

Si su versión de sed permite la bandera -i.bak (edición en su lugar):

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

Si no, simplemente ponerlo en un bucle de bash:

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

+1 para '-i.bak' gsed fu. Su 'for loop' probablemente necesite un archivo' mv $ file.new_file.txt $' para que coincida. – nik

+0

@Robert, si pierde el sedimento correcto, aún puede hacer: 'perl -pi.bak-e | s | línea de texto || g '\ *' – nik

+0

Eso deja una línea en blanco en lugar de borrar la línea, derecha ? –

1

me escribió un script Perl para esto:

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

Nota que elimina las líneas en base a una expresión regular. Si lo que quería hacer coincidencia exacta, el interior foreach se vería así:

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

Considérese -v grep:

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

Grep -v muestra todas las líneas, excepto las que coinciden, entran en un archivo temporal y, a continuación, el archivo tmp vuelve al antiguo nombre del archivo.

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

Esto le dice a Perl bucle sobre su archivo (-n), editar en su lugar (-i), e imprimir la línea si no coincide con la expresión regular.

Algo relacionado, esta es una forma práctica de realizar una sustitución sobre varios archivos.

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

De este [enlace] (http://www.kuro5hin.org/story/2009/3/9/191744/8407): ambos perl y sed son motores tradicionales NFA, por lo que teóricamente no deberían diferir mucho en su rendimiento, pero en realidad Perl tiene una gran cantidad de optimizaciones aplicadas que lo hacen funcionar bien en casos comunes. – stephenmm

6

Para encontrar a pattern y quitar the line containing the pattern a continuación comando se puede utilizar

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

Ejemplo: si desea eliminar la línea que contiene la palabra sleep en todos los archivos xml

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

NOTA: tenga cuidado antes de elegir un patrón ya que eliminará la línea recursivamente en todos los archivos en la jerarquía del directorio actual :)

Cuestiones relacionadas