Comment utiliser sed pour supprimer toutes les lignes d'un fichier texte qui contiennent une chaîne spécifique ?
Merci, mais cela ne semble pas l'effacer du fichier, mais simplement imprimer le contenu du fichier texte sans cette chaîne.
Comment utiliser sed pour supprimer toutes les lignes d'un fichier texte qui contiennent une chaîne spécifique ?
Pour supprimer la ligne et imprimer la sortie sur la sortie standard :
sed '/pattern to match/d' ./infile
Pour modifier directement le fichier - ne fonctionne pas avec BSD sed :
sed -i '/pattern to match/d' ./infile
Idem, mais pour BSD sed (Mac OS X et FreeBSD) - ne fonctionne pas avec GNU sed :
sed -i '' '/pattern to match/d' ./infile
Pour modifier directement le fichier (et créer une sauvegarde) - fonctionne avec BSD et GNU sed :
sed -i.bak '/pattern to match/d' ./infile
Merci, mais cela ne semble pas l'effacer du fichier, mais simplement imprimer le contenu du fichier texte sans cette chaîne.
@A Clockwork : oui, vous devez rediriger la sortie soit vers un nouveau fichier avec quelque chose comme sed '/pattern to match/d' ./infile > ./newfile
ou si vous voulez faire une modification sur place, vous pouvez ajouter l'option -i
à sed comme dans sed -i '/pattern to match/d' ./infile
. Notez que le -i
nécessite GNU sed et n'est pas portable
Il existe de nombreuses autres façons de supprimer les lignes contenant une chaîne de caractères spécifique, à part sed
:
awk '!/pattern/' file > temp && mv temp file
ruby -i.bak -ne 'print if not /test/' file
perl -ni.bak -e "print unless /pattern/" file
while read -r line
do
[[ ! $line =~ pattern ]] && echo "$line"
done <file > o
mv o file
grep -v "pattern" file > temp && mv temp file
Et bien sûr sed
(l'impression de l'inverse est plus rapide que la suppression réelle) :
sed -n '/pattern/!p' file
Comment supprimer une ligne particulière avec un motif et aussi la ligne immédiatement au-dessus ? J'ai une amende avec des milliers de lignes de ce type entre différentes données.
Sous OS/X, la variante shell ne préserve pas les espaces en tête, mais la variante grep -v a bien fonctionné pour moi.
Le site sed
a un comportement différent, il ne fait que greps ! il devrait être quelque chose comme sed -n -i '/pattern/!p' file
.
Vous pouvez utiliser sed pour remplacer les lignes en place dans un fichier. Cependant, cela semble être beaucoup plus lent que d'utiliser grep pour l'inverse dans un second fichier, puis de déplacer le second fichier sur l'original.
par exemple
sed -i '/pattern/d' filename
ou
grep -v "pattern" filename > filename2; mv filename2 filename
La première commande prend 3 fois plus de temps sur ma machine de toute façon.
Voter votre réponse aussi, juste parce que vous avez essayé une comparaison de performance !
Pour une raison quelconque, la version mac os sed (BSD) n'accepte pas les noms de fichiers de sauvegarde de longueur zéro, mais lorsqu'on en fournit un, cela fonctionne.
Vous pouvez envisager d'utiliser ex
(qui est un éditeur standard Unix à base de commandes) :
ex +g/match/d -cwq file
où :
+
exécute la commande Ex donnée ( man ex
), comme -c
qui exécute wq
(écrire et quitter)g/match/d
- Commande Ex pour effacer les lignes avec des données match
voir : Puissance de g
L'exemple ci-dessus est une méthode conforme à POSIX pour l'édition en place d'un fichier, comme suit poste à Unix.SE et Les spécifications POSIX pour ex
.
La différence avec sed
c'est que :
sed
est un S tream ED itor, et non un éditeur de fichiers. BashFAQ
À moins que vous n'appréciiez le code non portable, les surcharges E/S et d'autres effets secondaires néfastes. Donc, fondamentalement, certains paramètres (tels que in-place/ -i
) sont des extensions non standard de FreeBSD et peuvent ne pas être disponibles sur d'autres systèmes d'exploitation.
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.