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; } }