[bash] commande sed

Résolu/Fermé
enyrix Messages postés 145 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 - 27 juin 2012 à 17:16
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 28 juin 2012 à 10:32
Bonjour,
J'essaie d'exécuter deux commande sed une à la suite de l'autre. Individuellement elle fonctionnent bien, mais dès que j'en exécute une à la suite de l'autre j'ai un problème de output.
Premièrement l'option silent, quiet ou -n ne fonctionne pas complètement et deuxièement dans mon fichier de sortie se retrouve seulement l'exécution de la première commande...

J'ai essayer d'utiliser des wait, de mettre les commandes successivement après | etc.. mais ça ne fonctionne pas. Comment exécuté plusieurs commande seed une à la suite de l'autre dans le même fichier sans devoir mettre dans une seule commande.

Merci.

#!/bin/bash
clear
echo "Début du script patientez..."
cp testa tmp
echo "Nettoyage de l'entête..."
sed --silent -e "/^OLD_FOREIGN_KEY_CHECKS/d" tmp
echo "Ajout de lignes..."
sed --silent -e '/^LOCK TABLE/a DELETE FROM 'adresse';' tmp
mv tmp testb
echo "Script complété!"

2 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
27 juin 2012 à 17:25
Salut,

On peut avoir un exemple de ton fichier s'teuplé ?
0
enyrix Messages postés 145 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 8
27 juin 2012 à 17:37
fichier de départ:

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Dumping data for table 'adresse'
--

LOCK TABLES 'adresse' WRITE;
/*!40000 ALTER TABLE 'adresse' DISABLE KEYS */;
INSERT INTO 'adresse' VALUES (1,'abc');
INSERT INTO 'adresse' VALUES (2,'abc');
/*!40000 ALTER TABLE 'adresse' ENABLE KEYS */;
UNLOCK TABLES;


LOCK TABLES 'test2' WRITE;
/*!40000 ALTER TABLE 'adresse' DISABLE KEYS */;
INSERT INTO 'test2' VALUES (1,'allo');
/*!40000 ALTER TABLE 'adresse' ENABLE KEYS */;
UNLOCK TABLES;


Fichier de sortie voulue:

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Dumping data for table 'adresse'
--

LOCK TABLES 'adresse' WRITE;
DELETE FROM 'adresse';
/*!40000 ALTER TABLE 'adresse' DISABLE KEYS */;
INSERT INTO 'adresse' VALUES (1,'abc');
INSERT INTO 'adresse' VALUES (2,'abc');
/*!40000 ALTER TABLE 'adresse' ENABLE KEYS */;
UNLOCK TABLES;


LOCK TABLES 'test2' WRITE;
DELETE FROM 'test2';
/*!40000 ALTER TABLE 'adresse' DISABLE KEYS */;
INSERT INTO 'test2' VALUES (1,'allo');
/*!40000 ALTER TABLE 'adresse' ENABLE KEYS */;
UNLOCK TABLES;
0
enyrix Messages postés 145 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 8
27 juin 2012 à 17:39
supression d'une ligne et ajout des Delete... Il faut aussi que je trouve le moyen de récupérer le nom de la table pour l'insérer dans ma commande DELETE
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
27 juin 2012 à 18:15
$ cat plop 
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Dumping data for table 'adresse'
--

LOCK TABLES 'adresse' WRITE;
/*!40000 ALTER TABLE 'adresse' DISABLE KEYS */;
INSERT INTO 'adresse' VALUES (1,'abc');
INSERT INTO 'adresse' VALUES (2,'abc');
/*!40000 ALTER TABLE 'adresse' ENABLE KEYS */;
UNLOCK TABLES;


LOCK TABLES 'test2' WRITE;
/*!40000 ALTER TABLE 'adresse' DISABLE KEYS */;
INSERT INTO 'test2' VALUES (1,'allo');
/*!40000 ALTER TABLE 'adresse' ENABLE KEYS */;
UNLOCK TABLES;

$ sed "/OLD_FOREIGN_KEY_CHECKS/d;/LOCK TABLES/{h;s/[^']*\('[^']*'\).*/DELETE FROM \1;/;H;g}" plop 
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Dumping data for table 'adresse'
--

LOCK TABLES 'adresse' WRITE;
DELETE FROM 'adresse';
/*!40000 ALTER TABLE 'adresse' DISABLE KEYS */;
INSERT INTO 'adresse' VALUES (1,'abc');
INSERT INTO 'adresse' VALUES (2,'abc');
/*!40000 ALTER TABLE 'adresse' ENABLE KEYS */;
UNLOCK TABLES;
UNLOCK TABLES;


LOCK TABLES 'test2' WRITE;
DELETE FROM 'test2';
/*!40000 ALTER TABLE 'adresse' DISABLE KEYS */;
INSERT INTO 'test2' VALUES (1,'allo');
/*!40000 ALTER TABLE 'adresse' ENABLE KEYS */;
UNLOCK TABLES;
UNLOCK TABLES;

$ 
0
enyrix Messages postés 145 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 8
27 juin 2012 à 18:51
Ça ma l'air bon du premier coup, cela l'affiche à l'écran mais l'output vers le fichier ne semble pas correct. Je ne comprend pas trop la commande aussi, si c'est possible de m'expliquer en gros. Merci !
0
enyrix Messages postés 145 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 8
27 juin 2012 à 19:02
J'ai tester avec un autre fichier avec mes vrais valeurs: la premiere commande fonctionne qui consiste a éliminer la ligne contenant le forein keys (c'est correct) ... par contre ensuite et ça me donne des duplications des lock tables et du unlock au lieu d'ajouter le Delete ...

LOCK TABLES 'adresse' WRITE;
LOCK TABLES 'adresse' WRITE;
/*!40000 ALTER TABLE 'adresse' DISABLE KEYS */;
INSERT INTO 'adresse' VALUES (1,'15, 12ième rue');
/*!40000 ALTER TABLE 'adresse' ENABLE KEYS */;
UNLOCK TABLES;
UNLOCK TABLES;
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
27 juin 2012 à 19:05
Ouos sorry, j'avais oublié un "^" ;-(

sed "/OLD_FOREIGN_KEY_CHECKS/d;/^LOCK TABLES/{h;s/[^']*\('[^']*'\).*/DELETE FROM \1;/;H;g}"
0
enyrix Messages postés 145 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 8
27 juin 2012 à 19:15
Merci Ça semble avoir corrigé le unlock mais pas le truc en double... j'ai ajouter tmp à la suite car je voudrais l'avoir dans un fichier et non à l'écran mais ce n'est pas bon ce qu'il me donne...


Mon script:

#!/bin/bash
clear
echo "Début du script patientez..."
cp testx tmp
#echo "Nettoyage de l'entête..."
#sed -e "/^OLD_FOREIGN_KEY_CHECKS/d" tmp
#sed -e '/^LOCK TABLE/a DELETE FROM 'adresse';' tmp

sed "/OLD_FOREIGN_KEY_CHECKS/d;/^LOCK TABLES/{h;s/[^']*\('[^']*'\).*/DELETE FROM \1;/;H;g}" tmp
#echo "Ajout des lignes pour nettoyage de tables..."
#sed '/^LOCK TABLE/a DELETE FROM 'adresse';' tmp
echo "Script complété!"


Voici ce que j'obtiend à l'écran:



Début du script patientez...

-- MySQL dump 10.13  Distrib 5.1.58, for debian-linux-gnu (x86_64)
--
-- Host: localhost    Database: XXXXX
-- ------------------------------------------------------
-- Server version       5.1.58-1ubuntu1

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Dumping data for table 'adresse'
--

LOCK TABLES 'adresse' WRITE;
LOCK TABLES 'adresse' WRITE;
/*!40000 ALTER TABLE 'adresse' DISABLE KEYS */;
INSERT INTO 'adresse' VALUES (1,'5195, 127ième rue');
/*!40000 ALTER TABLE 'adresse' ENABLE KEYS */;
UNLOCK TABLES;

--
-- Dumping data for table 'affectation_liste_prix'
--

LOCK TABLES 'affectation_liste_prix' WRITE;
LOCK TABLES 'affectation_liste_prix' WRITE;
/*!40000 ALTER TABLE 'affectation_liste_prix' DISABLE KEYS */;
INSERT INTO 'affectation_liste_prix' VALUES (1,'2010-02-01 00:00:00',1,5,1,1,0),(2,'2011-03-01 00:00:00',1,2,1,0,0);
/*!40000 ALTER TABLE 'affectation_liste_prix' ENABLE KEYS */;
UNLOCK TABLES;

Script complété!
root@ubuntu:/_bashscripts# 


Je redonne mon fichier testa au cas ou:

-- MySQL dump 10.13  Distrib 5.1.58, for debian-linux-gnu (x86_64)
--
-- Host: localhost    Database: XXXXX
-- ------------------------------------------------------
-- Server version       5.1.58-1ubuntu1

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Dumping data for table 'adresse'
--

LOCK TABLES 'adresse' WRITE;
/*!40000 ALTER TABLE 'adresse' DISABLE KEYS */;
INSERT INTO 'adresse' VALUES (1,'5195, 127ième rue');
/*!40000 ALTER TABLE 'adresse' ENABLE KEYS */;
UNLOCK TABLES;

--
-- Dumping data for table 'affectation_liste_prix'
--

LOCK TABLES 'affectation_liste_prix' WRITE;
/*!40000 ALTER TABLE 'affectation_liste_prix' DISABLE KEYS */;
INSERT INTO 'affectation_liste_prix' VALUES (1,'2010-02-01 00:00:00',1,5,1,1,0),(2,'2011-03-01 00:00:00',1,2,1,0,0);
/*!40000 ALTER TABLE 'affectation_liste_prix' ENABLE KEYS */;
UNLOCK TABLES;


Merci pour ton aide précieuse!
0
enyrix Messages postés 145 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 7 avril 2021 8
27 juin 2012 à 19:26
Je crois que l'output fonctionne avec:
cp testx tmp
sed "/OLD_FOREIGN_KEY_CHECKS/d;/^LOCK TABLES/{h;s/[^']*\('[^']*'\).*/DELETE FROM \1;/;H;g}" tmp > tmp2


Je crois que c'étais le fait que je tentais de lire un fichier et de réécrire par dessus (je sais pas si c'est possible de faire autrement mais ça ça fonctionne...

Il me reste le problème du doubons... Aussi j'aimerais savoir si tu sais pourquoi deux sed ne fonctionnait pas un à la suite de l'autre ? Parce que comme c'est la si je dois par exemple faire un e boucle pour enlever plusieurs ligne autre que OLD_FOREIGN_KEY_CHECKS par exemple via un array je vais surement être mal pris..
0