Sed rechercher/remplacer une seule occurence...

Résolu/Fermé
Fred - Modifié le 27 mars 2023 à 17:16
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 - 25 mars 2023 à 19:36

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

A voir également:

3 réponses

avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 500
Modifié le 23 mars 2023 à 21:39

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

C'est effectivement plus simple...

Merci

0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 500
25 mars 2023 à 19:36

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

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