IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Remplacer le moins par underscore


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    Par défaut Remplacer le moins par underscore
    Salut !

    J'ai un petit problème depuis ce matin parce que je ne parviens toujours pas à remplacer "-" par "_" dans ceci : CREATE TABLE IF NOT EXISTS "ma_valeur_de-table"..
    J'ai utilisé la commande la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i "s/CREATE TABLE\s+IF NOT EXISTS \"([_\w]+)((\-)([_\w]+))\"/CREATE TABLE IF NOT EXISTS \"\1_\4\"/" ma_valeur_de-table.sql
    mais rien y faire.
    Aidez-moi, s'il vous plait.

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    tu selectionne qu'un patern \1 et tu demande le \4

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # echo 'CREATE TABLE IF NOT EXISTS "ma_valeur_de-table"..' | sed  '/CREATE TABLE.*IF NOT EXISTS/  s/[\w_]/-/g'
    suffit d'après ton exemple

    donnes nous plutot le contenu du fichier à traiter et le resultat attendu (si il y a autre chose à changer que des _ & - comme ça on pourra t'aider à trouver un truc fiable.

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Euh… sed 's/-/_/' devrait suffire non ?

  4. #4
    Membre averti
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    Par défaut
    @zipe31 : ta solution ne peut pas marcher parce qu'elle risque de changer ce que je ne veux pas dans le cas d'un UPDATE par exemple.
    @frp31: voici le contenu d'un de mes fichiers.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE  IF NOT EXISTS "ev_c_squares-jardins" (
       "id_elemgraph"   int NOT NULL, 
       "id_elemgraph_lib"   int NOT NULL, 
       "angle_lib"   int NOT NULL, 
       "id_geo"   char(3) NOT NULL, 
       "date_creation"   timestamp without time zone, 
       "date_modification"   timestamp without time zone, 
       "date_suppression"   timestamp without time zone, 
       "id_meta"   int default NULL
    )  ;
     
     ALTER TABLE "ev_c_squares-jardins" OWNER TO smanetagis;
     TRUNCATE TABLE "ev_c_squares-jardins" CASCADE;

    Ta solution me permettra de faire celle des ALTER, des TRUNCATE et des UPDATE.
    Je l'essaye de suite et je te tiens au courant.

    Merci bien!

  5. #5
    Membre averti
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    Par défaut
    Et le résultat attendu est:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE IF NOT EXISTS "ev_c_squares_jardins" (
    "id_elemgraph" int NOT NULL,
    "id_elemgraph_lib" int NOT NULL,
    "angle_lib" int NOT NULL,
    "id_geo" char(3) NOT NULL,
    "date_creation" timestamp without time zone,
    "date_modification" timestamp without time zone,
    "date_suppression" timestamp without time zone,
    "id_meta" int default NULL
    ) ;
     
    ALTER TABLE "ev_c_squares_jardins" OWNER TO smanetagis;
    TRUNCATE TABLE "ev_c_squares_jardins" CASCADE;

    C'est pour besoin d'une migration de MySQL vers PostgresSQL.

  6. #6
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # sed '/CREATE/,/\;/ s/-/_/' /tmp/titi
    CREATE TABLE IF NOT EXISTS "ev_c_squares_jardins" (
    "id_elemgraph" int NOT NULL,
    "id_elemgraph_lib" int NOT NULL,
    "angle_lib" int NOT NULL,
    "id_geo" char(3) NOT NULL,
    "date_creation" timestamp without time zone,
    "date_modification" timestamp without time zone,
    "date_suppression" timestamp without time zone,
    "id_meta" int default NULL
    ) ;
     
     
    ALTER TABLE "ev_c_squares-jardins" OWNER TO smanetagis;
    TRUNCATE TABLE "ev_c_squares-jardins" CASCADE;
    #

  7. #7
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour,

    Tu n'as pas une infinité de tables. À ta place, je ferais la liste dans un fichier et j'exécuterais la commande suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's@.*@s/-\1/_\1/g@' liste.txt|sed -f - monfichier.sql

  8. #8
    Membre averti
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    16
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 16
    Par défaut
    Votre 1ere solution a bien marché. Il fallait alterner le "-" et le "_".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i  '/CREATE TABLE.*IF NOT EXISTS/  s/[\w-]/_/g' mon_fichier_de-table.sql
    Merci encore à vous.

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Bonjour,

    Tu n'as pas une infinité de tables. À ta place, je ferais la liste dans un fichier et j'exécuterais la commande suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's@.*@s/-\1/_\1/g@' liste.txt|sed -f - monfichier.sql
    ça marche pô

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ echo "abc_def_ghi-jkl" | sed 's@.*@s/-\1/_\1/g@'
    sed: -e expression n°1, caractère 17: référence \1 invalide dans le côté droit de la commande `s'
     
    $ sed --version
    sed (GNU sed) 4.2.2
    Mais peut-être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat liste.txt | while read name ; do name_=$(echo "$name" | sed -e 's/-/_/g') ; echo "s/$name/$name_/g"; done | sed -f - monfichier.sql

  10. #10
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    ça marche pô
    Une faute partout, balle au centre: Ce que tu écris ne peut pas marcher car tu ne respectes pas ce que j'ai écrit. Mais ce que j'ai écrit est faux, aussi. Où avions-je la tête?

    Voici la bonne formule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's@.*@s/-&/_&/g@' liste.txt|sed -f - monfichier.sql
    Et voici la formule appliquée à ton exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "jkl"|sed 's@.*@s/-&/_&/g@' |sed -f - <(echo "abc_def_ghi-jkl")
    Au temps pour moi.

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Ce que tu écris ne peut pas marcher car tu ne respectes pas ce que j'ai écrit.
    Mouais...

    J'avions point compris que tu proposais de mettre seulement les suffixes incriminés dans le fichier... (je ne suis pas sûr que ce soit parfaitement bien spécifié dans ton message... )

    Du coup, avec ta méthode, on peut aussi utiliser \0:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's@.*@s/-\0/_\0/g@' liste.txt|sed -f - monfichier.sql

    La solution que je propose (et qui peut certainement être simplifiée) consiste à mettre dans le fichier la liste des noms (complets, avec des underscores et potentiellement plusieurs tirets) des tables à convertir et à générer (comme toi) l'instruction sed qui remplace le nom complet de la table par le même nom où tous les tirets ont été remplacés par des underscores.
    Personnellement, il me paraît plus sûr de remplacer "ev_c_squares-jardins" par "ev_c_squares_jardins" que de remplacer "-jardins" par "_jardins"!
    J'aime bien cibler au plus près! Sait-on jamais...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Batch] Remplacer espaces par underscores dans noms de fichiers
    Par Ysae68 dans le forum Scripts/Batch
    Réponses: 13
    Dernier message: 28/08/2017, 16h56
  2. Réponses: 1
    Dernier message: 21/07/2011, 09h49
  3. Remplacer des blancs par underscore
    Par JOLIFLO57 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/12/2008, 10h30
  4. Comment remplacer un espace par underscore?
    Par Jim_Nastiq dans le forum Langage
    Réponses: 6
    Dernier message: 05/04/2006, 16h13
  5. Remplacer plusieurs colonnes par un 'alias'
    Par zestrellita dans le forum Langage SQL
    Réponses: 7
    Dernier message: 22/04/2004, 16h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo