Supprimer la ligne de texte de plusieurs fichiers sous Linux

Existe-t-il un moyen simple de supprimer la même ligne de texte d’un dossier rempli de documents texte sur la ligne de commande?

Si votre version de sed autorise le drapeau -i.bak (modifier en place):

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

Sinon, il suffit de le mettre dans une boucle bash:

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

Pour trouver a pattern et supprimer the line containing the pattern ci-dessous, la commande peut être utilisée

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

Exemple: si vous souhaitez supprimer la ligne contenant le mot sleep dans tous les fichiers xml

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

REMARQUE: soyez prudent avant de choisir un modèle car il supprimera la ligne de manière récursive dans tous les fichiers de la hiérarchie de répertoires actuelle 🙂

Considérez grep -v:

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

Grep -v affiche toutes les lignes sauf celles qui correspondent, elles vont dans un fichier temporaire, puis le fichier tmpfile revient à l’ancien nom de fichier.

 perl -ni -e 'print if not /myssortingng/' * 

Cela indique à perl de faire une boucle sur votre fichier (-n), de le modifier à sa place (-i) et d’imprimer la ligne si elle ne correspond pas à votre expression régulière.

Quelque peu lié, voici un moyen pratique d’effectuer une substitution sur plusieurs fichiers.

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

J’ai écrit un script Perl pour cela:

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

Notez qu’il supprime les lignes basées sur une expression régulière. Si vous voulez faire une correspondance exacte, le foreach interne devrait ressembler à foreach :

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