J'ai un problème avec sed

Bonjours

je doit remplacer une ligne mais cela ne fonctionne pas

voila mais essais réaliser

1

je connais la cause mais arrive pas a trouver ce que je dois faire … la cause est les ("")

merci

gaaara (du pays du désert? :wink: ) , change ton titre pour remplacer seed par sed, ça peut attirer plus de personnes compétentes sur le sujet :wink:

quand je vois « sed » j’accours ! :007

Si tu des guillemets dans ce que tu as à substituer, tu peux tenter les quotes « ’ » pour encadrer la chaîne d’expression régulière. Bon je viens de réaliser que tu as des « " » et des « ’ »… Dans ce cas il faut les backslasher. Il semblerait que tu aies déjà essayé aussi, si j’en crois le code que tu as posté.

Il reste la botte secrète de la jouer en 2 bandes : 2 sed consécutifs pour contourner le soucis (au besoin avec l’option -e pour faire des one-liners).

Peux-tu fournir une ligne typique du fichier /var/www/rutorrent/conf/config.php qui contienne le motif que tu souhaites substituer STP ? Puis la même ligne substituée à ta sauce ? Ça pourrait nous aider à mieux cerner le soucis, et potentiellement à tester un truc dans notre coin avant de te le soumettre.

Merci !
Bon courage !

pas de problème :slightly_smiling:

Original
$pathToExternals = array( "php" => '', // Something like /usr/bin/$ "curl" => '', // Something like /usr/bin/$ "gzip" => '', // Something like /usr/bin/$ "id" => '', // Something like /usr/bin/$ "stat" => '', // Something like /usr/bin/$ );

ce que j’ai a changer

je doit simplement ajouter le chemin :slightly_smiling: en bash et je vois pas autre chose je suis encore un débutent ^^

voila :slightly_smiling: merci de votre aide :slightly_smiling:

Salut,

Je viens de tester sur un fichier test et cette commande fonctionne :wink:

sed -i "s/\"curl\" => '',/\"curl\" => '\/usr\/bin\/curl',/g" test

Pour toi :

Faut faire attention aux espaces :stuck_out_tongue: car je n’avais pas fait attention mais tu as un double espace entre curl et ton =>

Cordialement,

Une autre solution sur le fichier test, pour illustrer le « fais-le en 2 bandes » :

en gros :
— le premier « -e » s’occupe d’ajouter /usr/bin/curl après « “curl” => » (regex entourée de ‘’ pour traiter les “” sans encombre)
— le second « -e » ajoute des quotes (regex entourée de “” pour traiter les ‘’ sans encombre)
D’un coup c’est moins la fête du backslash.

À noter également les « \s* » : un nombre arbitraire (0 ou plus) d’espaces consécutifs, et « \S* » : un nombre arbitraire (0 ou plus) de non-espaces consécutifs. L’enchainement « =>\s*\S*, » détecte jusqu’à la dernière virgule sans espace du mot qui suit « => » avec ou sans espace entre « => » et ce mot.

En cas de pépin (genre « /usr/bin/curl » est aussi présent à 1+ autre endroit dans le fichier où tu ne veux pas le modifier) :

sed -i -e 's#"curl"\s*=>\s*\S*,#"curl" => __/usr/bin/curl__,#' -e "s#__/usr/bin/curl__,#'/usr/bin/curl',#" test sed -i -e 's#"curl"\s*=>\s*\S*,#"curl" => <truc_arbitraire>,#' -e "s#<truc_arbitraire>,#'/usr/bin/curl',#" test
en gros : rendre le motif intermédiaire spécifique pour ne substituer que celui-ci à la deuxième bande

Un peu plus perfectionné (trop ?) :

sed -i -e 's#"curl"\(\s*=>\s*\)\S*,#"curl"\1/usr/bin/curl,#' -e "s#/usr/bin/curl#'/usr/bin/curl'#" testle « \1 » recopie le motif détecté entre parenthèses « (\s*=>\s*) » tel que.

Voilà un condensé de ma façon de penser, ensuite en fonction du contexte l’implémentation peut varier. Privilégier une implémentation lisible mais peu élégante est souvent souhaitable pour que quelqu’un ne te maudisse pas dans quelques années :slightly_smiling: À noter que les critères de lisibilité sont très subjectifs.

sed -i "s#\"curl\"  => '',#\"curl\"  => '/usr/bin/curl'#" machin