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 :

Ajouter des caractères avec sed


Sujet :

Shell et commandes GNU

  1. #1
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut Ajouter des caractères avec sed
    Bonsoir a tous,

    j'ai un fichier avec des registres et pour un des champs je dois ajouter en fin de ligne une suite de lettre...mais voila je sais pas trop comment.

    Voici le fichier:


    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    =LDR  01649nas a22003851a 4500
    =001  vtls000000236
    =003  VRT
    =005  20110511110800.0
    =008  100528d19832011spca|||||\|||o0\\\||cat|\
    =035  \\$aC2586-23760
    =039  \9$a201105111108$bstaff$c201104181341$dstaff$c201104181329$dstaff$c201104181327$dstaff$y2000092208370000$zload
    =040  \\$aES-Ba-GIE$bcat$cEs-Ba-GIE
    =090  \\$a03
    =091  \\$aDeixat de publicar
    =092  \\$aAnuari
    =098  \\$aGI-0350
    =099  \\$aSALA-03.03(C)
    =245  00$aHotels Catalunya :$bguia... /$cGeneralitat de Catalunya. Departament de  Comerç,Turisme i Consum. Direcció General de Turisme
    =246  3\$aGuia d'hotels...
    =260  \\$aBarcelona :$bGeneralitat de Catalunya. Departament de d'Indústria, Comerç i Turme,$c1983-2011
    =310  \\$aAnual
    =362  0\$a1983-2011
    =500  \\$aFins l'any 2005 ho publicava el  Departament d'Indústria, Comerç i Turisme
    =500  \\$aTÃ*tol a coberta: "Guia d'hotels..."
    =530  \\$aTambé disponible la consulta interactiva a través de la pÃ*gina web del Departatenn
    =650  04$aHotels
    =651  \4$aCatalunya
    =710  2\$aCatalunya.$bDepartament d'Indústria, Comerç i Turisme
    =710  1\$aCatalunya.$bDirecció General de Turisme
    =730  00$aPEC 2006-2009
    =830  \0$aGuies (Catalunya. Generalitat) ;$v7
    =952  \0$85$aAny inf.:$bEd.$u1$vc$wa
    =952  \0$82.17$aAny inf.: 1999 Ed. 1998
    =952  \0$82.18$aAny inf.: 2000 Ed. 2000
    =935  \\$aC258623760
    =999  \\$aVIRTUA50
    =999  \\$aVTLSSORT0010*0030*0050*0080*0350*0390*0400*0900*0910*0920*0980*0990*2450*2460*2600*3100*3620*5000*5001*5300*6500*6510*7100*7101*7300*8300*8560*9350*9990*9991
     
    =LDR  00964nam a22002531a 4500
    =001  vtls000000113
    =003  VRT
    Le champs =LDR sert a separer les registres...Et les champs commencent tous par un ID avec un = devant

    le champ qui m'interesse est de =952
    Dans l'exemple il se repete plusieurs fois dans le même registre.. Ça c'est normal.
    Donc je souhaite ajouter ceci $aidescat$bidescat a la fin de chaque champs =952
    Ce qui donnerait (j'en orend 2 juste pour l'exemple):


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    =952  \0$85$aAny inf.:$bEd.$u1$vc$wa$aidescat$bidescat
    =952  \0$82.17$aAny inf.: 1999 Ed. 1998$aidescat$bidescat
    Alors en cherchant un peu j'ai trouvé ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sed -i '/[0-9]\{9\} 952/s/\($a.*\)/\1\$aidescat$bidescat /g' Result.txt >salida.mrk
    Mais le fichier de sortie est vide.
    Quelqu'un connait le truc?

    D'avance merci

  2. #2
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/^=952 / s/$/$aidescat$bidescat /' Result.txt >salida.mrk
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  3. #3
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Bonjour
    wha genial ça marche.. J'aimerais comprendre.
    Le caracter ^ signifie "position toi a la fin" et le fait de le placer devant le 952 ça revient a dire, positione toi a la fin du champs 952 ?
    Ça marche comme ça?

  4. #4
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par ldiaz Voir le message
    Le caracter ^ signifie "position toi a la fin" et le fait de le placer devant le 952 ça revient a dire, positione toi a la fin du champs 952 ?
    Ça marche comme ça?
    Euh... non, pas du tout

    le caractère '^' placé en premier dans un motif comprenant une expression régulière signfie le début de la ligne. Donc dans ton cas, /^=952 / veut dire qu'on recherche une ligne commençant par le signe égale et suivi du nombre 952, lui même suivi d'un espace.

    Le caractère "$" (dollar) quant à lui, placé en fin d'un motif de recherche, signifie la fin d'une ligne, ce qui se traduit dans l'expression s/$/$aidescat$bidescat /, substituer (commande s), la fin de la ligne représentée par le signe $ (dollar) par le motif "$aidescat$bidescat ".
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  5. #5
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Bonjour
    a ben j'ai bien fait de poser la question.
    J'aurais certainement d'autres cas, comme par exemple isoler une partie et la remplacer par autre chose, et la...c'est pareil comment faire?

    L'exemple est le suivant:

    dans le nouveau fichier j'ai ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =952  \0$82.3$aAny inf.: 1997 Ed. 1998$aidescat$bidescat
    Et si je souhaite effacer le texte qui se trouve entre le premier \0$ et le $a
    c'est a dire, ceci: \0$82.3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =952  $aAny inf.: 1997 Ed. 1998$aidescat$bidescat
    Ça peut aussi se faire avec sed?

    D'avance merci

  6. #6
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Re-

    Pour l'exemple je n'affiche que les lignes de ton fichiers commençant par "=952".
    Contenu de ton fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ sed -n '/^=952 /p' plop 
    =952  \0$85$aAny inf.:$bEd.$u1$vc$wa
    =952  \0$82.3$aAny inf.: 1997 Ed. 1998$aidescat$bidescat
    =952  \0$82.17$aAny inf.: 1999 Ed. 1998
    =952  \0$82.18$aAny inf.: 2000 Ed. 2000
    Traitement sur le fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ sed -n '/^=952 /{s/\\0$[^$]*//p}' plop 
    =952  $aAny inf.:$bEd.$u1$vc$wa
    =952  $aAny inf.: 1997 Ed. 1998$aidescat$bidescat
    =952  $aAny inf.: 1999 Ed. 1998
    =952  $aAny inf.: 2000 Ed. 2000
    $
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  7. #7
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Oula ça se complique...
    Alors ce que je comprends:

    Pour l'affichage c'est ok, ça je vois bien comment ça marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/^=952 /p' plop
    p pour print surement

    Mais l'autre commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/^=952 /{s/\\0$[^$]*//p}' plop
    ça dit, traite seulement toutes lignes qui commencent par =952
    je suppose que {} c'est pour encapsuler une autre serie de commande.
    le s/ pour substitute
    \\0$ .. le premier slash c'est pour faire un escape n'est ce pas?
    [^$] ça je pige pas.
    et les // ça veut dire que tu remplace par rien.

    Ça marche bien, je clic sur resolu.

    Merci pour toutes les aides

  8. #8
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par ldiaz Voir le message
    Oula ça se complique...
    Alors ce que je comprends:

    Pour l'affichage c'est ok, ça je vois bien comment ça marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/^=952 /p' plop
    p pour print surement
    Oui. Mais là c'était uniquement dans le but de n'afficher que la partie qui nous intéressait à titre d'exemple.

    Mais l'autre commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/^=952 /{s/\\0$[^$]*//p}' plop
    ça dit, traite seulement toutes lignes qui commencent par =952
    Oui.

    je suppose que {} c'est pour encapsuler une autre serie de commande.
    OUi. Comme c'est placé derrière le motif, les commandes ne s'appliqueront qu'aux lignes contenant ce motif.

    le s/ pour substitute
    Oui.

    \\0$ .. le premier slash c'est pour faire un escape n'est ce pas?
    Oui, c'est pour protéger l'anti-slash existant. Le "\" est un caractère réservé pour sed (et bien d'autres programmes), donc pour une interprétation littérale il faut le protéger afin qu'il soit reconnu en tant que tel...

    [^$] ça je pige pas.
    Il faut parler de l'expression entière "[^$]*" avec le "*" (astérisque) compris.
    En fait le "^" placé entre crochets (les crochets permettent de regrouper des caractères), indique que le (ou les) caractère(s) qui le suive(nt), ne devront pas faire partie de la chaîne de caractères recherchée et par conséquent l'évaluation du motif s'arrêtera dès qu'un des caractères excluent sera rencontré.
    Donc on cherche aucun, un ou plusieurs caractères (*) sauf un dollar ($)

    et les // ça veut dire que tu remplace par rien.
    Oui. En gros on efface.

    Ça marche bien, je clic sur resolu.

    Merci pour toutes les aides
    De rien
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  9. #9
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    C'est de la folie sed... non?
    J'adore.
    Merci pour tes explication, c'est super clair.
    Te te souhaite une bonne journée !

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

Discussions similaires

  1. Ajouter des boutons avec setParent ?
    Par NiamorH dans le forum Windows
    Réponses: 2
    Dernier message: 18/12/2006, 13h58
  2. ajouter des input avec select
    Par nicerico dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/11/2006, 09h56
  3. [Système] supprimer des caractères avec preg_replace
    Par Fritzoune dans le forum Langage
    Réponses: 3
    Dernier message: 02/10/2006, 13h59
  4. [Débutant][JSP] Ajout des caractères à une String...
    Par Henkyl dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 04/03/2004, 16h30
  5. Réponses: 1
    Dernier message: 02/01/2003, 12h45

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