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?Vous pouvez également supprimer une série de lignes dans un fichier. Par exemple, pour supprimer des procédures stockées dans un fichier SQL.
sed '/CREATE PROCEDURE.*/,/END ;/d' sqllines.sql
Cela supprimera toutes les lignes entre CREATE PROCEDURE et END ;.
J'ai nettoyé de nombreux fichiers sql avec cette commande sed.
perl -i -nle'/regexp/||print' file1 file2 file3
perl -i.bk -nle'/regexp/||print' file1 file2 file3
La première commande édite le(s) fichier(s) en place (-i).
La deuxième commande fait la même chose mais conserve une copie ou une sauvegarde du ou des fichiers originaux en ajoutant .bk aux noms de fichiers (.bk peut être changé en n'importe quoi).
Curieusement, la réponse acceptée ne répond pas directement à la question. La question porte sur l'utilisation de sed pour remplacer un chaîne de caractères mais la réponse semble présupposer la connaissance de la manière de convertir une chaîne arbitraire en un fichier de type regex .
De nombreuses bibliothèques de langage de programmation disposent d'une fonction permettant d'effectuer une telle transformation, par ex.
python: re.escape(STRING)
ruby: Regexp.escape(STRING)
java: Pattern.quote(STRING)
Mais comment le faire en ligne de commande ?
Comme il s'agit d'une question orientée sed, une approche serait d'utiliser sed lui-même :
sed 's/\([\[/({.*+^$?]\)/\\\1/g'
Ainsi, étant donné une chaîne arbitraire $STRING, nous pourrions écrire quelque chose comme :
re=$(sed 's/\([\[({.*+^$?]\)/\\\1/g' <<< "$STRING")
sed "/$re/d" FILE
ou en une seule phrase :
sed "/$(sed 's/\([\[/({.*+^$?]\)/\\\1/g' <<< "$STRING")/d"
avec des variations telles que décrites ailleurs sur cette page.