Comment utiliser sed pour supprimer toutes les lignes d'un fichier texte qui contiennent une chaîne spécifique ?
Réponses
Trop de publicités?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
où $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.
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