Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Membre confirmé
    Profil pro Luis
    Inscrit en
    avril 2006
    Messages
    681
    Détails du profil
    Informations personnelles :
    Nom : Luis

    Informations forums :
    Inscription : avril 2006
    Messages : 681
    Points : 241
    Points
    241

    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 :
    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 :
    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 :
     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 Confirmé Sénior
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    1 715
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : janvier 2011
    Messages : 1 715
    Points : 5 439
    Points
    5 439

    Par défaut

    Salut,

    Code :
    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 confirmé
    Profil pro Luis
    Inscrit en
    avril 2006
    Messages
    681
    Détails du profil
    Informations personnelles :
    Nom : Luis

    Informations forums :
    Inscription : avril 2006
    Messages : 681
    Points : 241
    Points
    241

    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 Confirmé Sénior
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    1 715
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : janvier 2011
    Messages : 1 715
    Points : 5 439
    Points
    5 439

    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 confirmé
    Profil pro Luis
    Inscrit en
    avril 2006
    Messages
    681
    Détails du profil
    Informations personnelles :
    Nom : Luis

    Informations forums :
    Inscription : avril 2006
    Messages : 681
    Points : 241
    Points
    241

    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 :
    =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 :
    =952  $aAny inf.: 1997 Ed. 1998$aidescat$bidescat
    Ça peut aussi se faire avec sed?

    D'avance merci

  6. #6
    Expert Confirmé Sénior
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    1 715
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : janvier 2011
    Messages : 1 715
    Points : 5 439
    Points
    5 439

    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 :
    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 :
    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 confirmé
    Profil pro Luis
    Inscrit en
    avril 2006
    Messages
    681
    Détails du profil
    Informations personnelles :
    Nom : Luis

    Informations forums :
    Inscription : avril 2006
    Messages : 681
    Points : 241
    Points
    241

    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 :
    sed -n '/^=952 /p' plop
    p pour print surement

    Mais l'autre commande:
    Code :
    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 Confirmé Sénior
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    1 715
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : janvier 2011
    Messages : 1 715
    Points : 5 439
    Points
    5 439

    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 :
    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 :
    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 confirmé
    Profil pro Luis
    Inscrit en
    avril 2006
    Messages
    681
    Détails du profil
    Informations personnelles :
    Nom : Luis

    Informations forums :
    Inscription : avril 2006
    Messages : 681
    Points : 241
    Points
    241

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •