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

Linux Discussion :

Sed remplacement en fonction du contexte


Sujet :

Linux

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 115
    Points : 104
    Points
    104
    Par défaut Sed remplacement en fonction du contexte
    Bonjour,

    Je ne suis pas un habitue de sed, j'espere que vous pourrez m'aider ou me diriger sur le bon outil.

    J'ai un fichier de configuration sous cette forme :

    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
            <Setting>
                    <SettingName>hal.stdin</SettingName>
                    <Identifier>STDIN</Identifier>
                    <Type>UnquotedString</Type>
                    <Value>none</Value>
                    <DefaultValue>none</DefaultValue>
                    <DestinationFile>system_h_define</DestinationFile>
                    <Description>Slave descriptor of STDIN character-mode device. This setting is used by the ALT_STDIN family of defines in system.h.</Description>
                    <Restrictions/>
                    <Group>Common</Group>
            </Setting>
            <Setting>
                    <SettingName>hal.stdout</SettingName>
                    <Identifier>STDOUT</Identifier>
                    <Type>UnquotedString</Type>
                    <Value>none</Value>
                    <DefaultValue>none</DefaultValue>
                    <DestinationFile>system_h_define</DestinationFile>
                    <Description>Slave descriptor of STDOUT character-mode device. This setting is used by the ALT_STDOUT family of defines in system.h.</Description>
                    <Restrictions/>
                    <Group>Common</Group>
            </Setting>
            <MemoryMap>
                    <slaveDescriptor>main_mem</slaveDescriptor>
                    <addressRange>0x00000000 - 0x007FFFFF</addressRange>
                    <addressSpan>8388608</addressSpan>
                    <attributes>memory</attributes>
            </MemoryMap>
    Mon but est de remplacer le valeur none (balise Value) de hal.stdout par une autre valeur.

    Le soucis comme vous l'aurez compris c'est que le pattern <Value>*</Value> apparait partout, il faut donc tenir compte du contexte.

    Comment pourrai-je faire avec sed ? Est-il l'outil qu'il me faut vu que sed travaille ligne par ligne, peut-etre que faire ce que je souhaite n'est pas possible.

    Merci

  2. #2
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Un truc qui marche avec l'échantillon proposé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed  '/STDOUT/,/STDOUT/ s/none/NouvelleValeur/' fichier
    Ou alors un script un peu plus pointu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while read L
    do
       Tag=${L%%>*}; Tag=${Tag:1}
       Val=${L%<*}; Val=${Val#*>}
       [ "$Tag" = "SettingName" ] && [ "$Val" = "hal.stdout" ] && Found=1
       if ((Found)) && [ "$Tag" = "Value" ]
       then
          echo "$L" | sed "s/$Val/NOUVELLE/"
          Found=0
       else
          echo "$L"
       fi
    done <fichier

  3. #3
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Points : 5 915
    Points
    5 915
    Par défaut
    Il me semble que ce genre de chose est plus le travail de AWK que de SED


    hal.txt étant le l'extrait que tu as donné :

    hal.awk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    BEGIN{
    RS="</Setting>"
    RT=">"
    ORS="</Setting>"
    }
    {
    if ( $0 ~ /hal.stdout/ )
            {
              gsub("<Value>none</Value>","<Value>VALEUR</Value>");
            }
    print $0
    }
    La commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    awk -f hal.awk hal.txt
    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
     
    [becket@MaMachine ~]$ awk -f hal.awk hal.txt
            <Setting>
                    <SettingName>hal.stdin</SettingName>
                    <Identifier>STDIN</Identifier>
                    <Type>UnquotedString</Type>
                    <Value>none</Value>
                    <DefaultValue>none</DefaultValue>
                    <DestinationFile>system_h_define</DestinationFile>
                    <Description>Slave descriptor of STDIN character-mode device. This setting is used by the ALT_STDIN family of defines in system.h.</Description>
                    <Restrictions/>
                    <Group>Common</Group>
            </Setting>
            <Setting>
                    <SettingName>hal.stdout</SettingName>
                    <Identifier>STDOUT</Identifier>
                    <Type>UnquotedString</Type>
                    <Value>VALEUR</Value>
                    <DefaultValue>none</DefaultValue>
                    <DestinationFile>system_h_define</DestinationFile>
                    <Description>Slave descriptor of STDOUT character-mode device. This setting is used by the ALT_STDOUT family of defines in system.h.</Description>
                    <Restrictions/>
                    <Group>Common</Group>
            </Setting>
            <MemoryMap>
                    <slaveDescriptor>main_mem</slaveDescriptor>
                    <addressRange>0x00000000 - 0x007FFFFF</addressRange>
                    <addressSpan>8388608</addressSpan>
                    <attributes>memory</attributes>
            </MemoryMap>

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 115
    Points : 104
    Points
    104
    Par défaut
    Je vous remercie tous les deux pour ces reponses, j'ai une preference pour la solution basee sur awk (parce que c'est un outil que je ne connais quasiment pas et que je sais fort utile d'apres les retours que j'en ai eu)

    La commande avec sed est sympa aussi et courte mais cela fonctionne sur ces valeurs car STDOUT par exemple apparait dans le nom et la description mais ce n'est pas toujours le cas.

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

Discussions similaires

  1. [dlgProc] Peut on remplacer la fonction DlgProc d un HWND
    Par magnus2005 dans le forum Windows
    Réponses: 2
    Dernier message: 11/04/2007, 09h24
  2. Comment remplacer une fonction d une touche clavier
    Par dominic75 dans le forum Autres Logiciels
    Réponses: 5
    Dernier message: 10/04/2006, 17h09
  3. [Mail] remplacer la fonction mail()
    Par Tostaki dans le forum Langage
    Réponses: 1
    Dernier message: 03/04/2006, 21h27
  4. [Migration D1->D5]Remplacer la fonction MaxAvail
    Par Laurent Dardenne dans le forum Langage
    Réponses: 2
    Dernier message: 23/12/2005, 19h22
  5. Remplacement des fonctions D3DX
    Par pot dans le forum DirectX
    Réponses: 1
    Dernier message: 23/11/2005, 18h37

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