2355 votes

Comment supprimer d'un fichier texte, toutes les lignes qui contiennent une chaîne spécifique ?

Comment utiliser sed pour supprimer toutes les lignes d'un fichier texte qui contiennent une chaîne spécifique ?

29voto

Aniket Sinha Points 391

J'ai eu du mal avec cela sur Mac. De plus, je devais le faire en utilisant le remplacement de variables.

Alors j'ai utilisé :

sed -i '' "/$pattern/d" $file

$file est le fichier où la suppression est nécessaire et $pattern est le motif à faire correspondre pour la suppression.

J'ai choisi le '' de ce commentaire .

La chose à noter ici est l'utilisation de guillemets doubles sur "/$pattern/d" . La variable ne fonctionnera pas si nous utilisons des guillemets simples.

23voto

Bhuvanesh Points 795

Vous pouvez également utiliser ceci :

 grep -v 'pattern' filename

Ici -v n'imprimera que des éléments autres que votre motif (ce qui signifie une correspondance inversée).

19voto

Jahid Points 12756

Pour obtenir un résultat similaire à celui d'une place avec grep vous pouvez le faire :

echo "$(grep -v "pattern" filename)" >filename

18voto

djperalta Points 77

Supprimer les lignes de tous les fichiers qui correspondent à la correspondance

grep -rl 'text_to_search' . | xargs sed -i '/text_to_search/d'

16voto

Jadzia Points 341

J'ai fait un petit benchmark avec un fichier qui contient environ 345 000 lignes. La méthode avec grep semble être environ 15 fois plus rapide que le sed dans ce cas.

J'ai essayé avec et sans le paramètre LC_ALL=C, il ne semble pas changer les timings de manière significative. La chaîne de recherche (CDGA_00004.pdbqt.gz.tar) se trouve quelque part au milieu du fichier.

Voici les commandes et les horaires :

time sed -i "/CDGA_00004.pdbqt.gz.tar/d" /tmp/input.txt

real    0m0.711s
user    0m0.179s
sys     0m0.530s

time perl -ni -e 'print unless /CDGA_00004.pdbqt.gz.tar/' /tmp/input.txt

real    0m0.105s
user    0m0.088s
sys     0m0.016s

time (grep -v CDGA_00004.pdbqt.gz.tar /tmp/input.txt > /tmp/input.tmp; mv /tmp/input.tmp /tmp/input.txt )

real    0m0.046s
user    0m0.014s
sys     0m0.019s

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X