Sed rechercher/remplacer une seule occurence...

Résolu
Fred -  
avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   -

Bonjour,

Via un sed, je veux remplacer dans un fichier :

$config['default_host'] = 'tls://{{domaine}}';

par :

$config['default_host'] = 'tls://webmail.{{domaine}}';

Je lance donc :

sed -i 's/\$config[\'default_host\'] = \'tls:\/\//{{domaine}}\'/\$config[\'default_host\'] = \'tls:\/\/webmail.{{domaine}}\'/' config.inc.php

J'ai échappé les caractères spéciaux avec \ mais cela ne passe pas. Cela renvoie un >

Je tente de faire un :

sed -i 's/{{domaine}}/webmail.{{domaine}}/1' config.inc.php
mais tous les champs {{domaine}} sont modifiés alors que je ne demandais que le premier avec le /1

J'utilise sed 4.7. Une idée ?

Merci

3 réponses

  1. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511
     

    Bonjour,

    Tu peux tout d'abord appliquer une condition et ensuite, faire la substitution :

    sed '/default_host/s/example.com/webmail.example.com/g' << "SCRIPT"
    <?php
    $config['url'] = 'https://example.com';
    $config['default_host'] = 'tls://example.com';
    //...
    SCRIPT
    

    Donne :

    <?php
    $config['url'] = 'https://example.com';
    $config['default_host'] = 'tls://webmail.example.com';
    //...
    

    On a donc bien remplacé example.com par webmail.example.com sous condition que la ligne contienne default_host. L'autre ligne n'est pas affectée.

    1
    1. Fred
       

      C'est effectivement plus simple...

      Merci

      0
  2. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511
     

    Bonjour,

    Dans ce cas :

    sed  '0,/default_host/{/default_host/s/example.com/webmail.example.com/}' << "SCRIPT"
    <?php
    $config['url'] = 'https://example.com';
    $config['default_host'] = 'tls://example.com';
    $config2['url'] = 'https://example.com';
    $config2['default_host'] = 'tls://example.com';
    //...
    SCRIPT

    On dit à sed de travailler jusqu'à la première occurrence de "default_host", et de faire la substitution de "example.com" -> "webmail.example.com" uniquement sur les lignes contenant "default_host".

    Le résultat est alors

    <?php
    $config['url'] = 'https://example.com';
    $config['default_host'] = 'tls://webmail.example.com';
    $config2['url'] = 'https://example.com';
    $config2['default_host'] = 'tls://example.com';
    //...
    
    1
  3. Fred
     

    Super, par contre je ne comprends pas pourquoi je n'arrive à remplacer une seule occurence avec le /1 au lieu du /g

    sed '/default_host/s/example.com/webmail.example.com/g'

    ... et

    sed '/default_host/s/example.com/webmail.example.com/1'

    ... semblent avoir le même effet, alors que je ne voudrais changer que la première ligne qui contient "default_host" dans mon fichier. Or cette variable apparaît plusieurs fois...

    Fred

    0