¿Hay una manera simple de eliminar la misma línea de texto de una carpeta llena de documentos de texto en la línea de comandos?Eliminar línea de texto de varios archivos en Linux
Respuesta
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
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;
}
}
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.
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/' *
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
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 :)
- 1. Linux: eliminar extensiones de archivos para varios archivos
- 2. append un texto al final de varios archivos en Linux
- 3. Linux: fusionando varios archivos, cada uno en una nueva línea
- 4. Script de línea de comandos para eliminar la fila de encabezado de varios archivos TXT
- 5. ¿Cómo dividir un archivo de texto en varios archivos?
- 6. Cómo agregar varios archivos jar en classpath en Linux
- 7. Uso de python para escribir archivos de texto con terminaciones de línea de DOS en Linux
- 8. edición automatizada de varios archivos
- 9. Motor de consulta SQL para archivos de texto en Linux?
- 10. Eliminar declaraciones duplicadas de CSS en varios archivos
- 11. Cómo eliminar salto de línea en el compañero de texto
- 12. Mantener los archivos cargados sincronizados en varios servidores - PHP Linux
- 13. Eliminación de varios archivos con el comodín
- 14. Eliminar varios archivos en MongoDB GridFS en PHP
- 15. Leer dos archivos de texto línea por línea simultáneamente -python
- 16. código de perl para fusionar varios archivos de texto
- 17. Eliminar varios archivos que coincidan con un patrón
- 18. eliminar los 5 primeros caracteres en cualquier línea de un archivo de texto en Linux con sed
- 19. Compilación de varios archivos Ocaml
- 20. combina varios pdfs en linux usando script?
- 21. ¿Tiene varios archivos?
- 22. ¿Entradas de varios archivos?
- 23. Registro de Python en varios archivos
- 24. bash, Linux: establecer la diferencia entre dos archivos de texto
- 25. Eliminar varios documentos en CouchDB
- 26. JavaScript en varios archivos
- 27. Renombrar (o eliminar el prefijo) varios archivos a cada número
- 28. Cómo recortar (cortar) archivos de texto basados en números de línea iniciales y finales en cygwin?
- 29. ¿Cómo eliminar saltos de línea de un archivo en Java?
- 30. Fusionando varios archivos javascript
+1 para '-i.bak' gsed fu. Su 'for loop' probablemente necesite un archivo' mv $ file.new_file.txt $' para que coincida. – nik
@Robert, si pierde el sedimento correcto, aún puede hacer: 'perl -pi.bak-e | s | línea de texto || g '\ *' – nik
Eso deja una línea en blanco en lugar de borrar la línea, derecha ? –