Supprimer une ligne précise d’un énorme fichier avec sed

Nous avons l’habitude de manipuler un fichier en ligne de commande avec vim par exemple, cependant, lorsque le fichier est énorme, (dans les 4Go par exemple), vim aime moins… du moins, les temps de traitements sont énormément long. Nous allons donc utiliser sed.
En l’occurrence, je souhaitais effacer une ligne précise au début de mon backup de base, la ligne en question, se trouvant dans les 30 premières lignes.


Celle qui dit : « efface la base si elle existe… » vous savez ?
exemple :

 /*!40000 DROP DATABASE IF EXISTS `myDatabase`*/;

Tout d’abord, il me faut trouver le numéro de la ligne en question : En associant la commande ‘head -n 30’ à un ‘grep -n’, j’allège ma manipulation et trouve le bon numéro de ligne. Notez que dans le grep, je supprime la partie comportant des caractères un peu ‘spéciaux’ pour éviter les erreurs d’interprétation par le shell.

head -n 30 backup_data_motionStats.sql |grep -n 'DROP DATABASE IF EXISTS'
22:/*!40000 DROP DATABASE IF EXISTS `myDatabase`*/;

Ce qui me donne la ligne 22.

Ensuite, il me suffit de demander à ‘sed’ de supprimer la ligne 22, tout simplement avec la commande ’22d’ comme ceci :

sed -i -e "22d" /var/tmp/backup_myDatabase.sql

le -i indique à sed de travailler directement sur le fichier. En réalité il passera par un fichier temporaire, et donc prendra quand même tu temps, mais ceci dit, il sera bien plus rapide que vim!

J’aurais pu également demander à sed de me supprimer la ligne contenant /*!40000 DROP DATABASE IF EXISTS `myDatabase`*/; mais les caractères ‘!’ et ‘`’ sont également interprétés par sed, ce qui complexifierait pas mal ma commande.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *