Script Bash - SED

Bonjour à tous !

Je galère un peu à utiliser la commande sed sur ma debian 9.

Je souhaiterai échanger deux chemins d’accés.

sed -i "s/"mysave = %\(here\)s/backup/"."mysave = /var/incase/backup/"/g" /etc/incase/config.ini

-> Remplacer
mysave = %\(here\)s/backup/
par
mysave = /var/incase/backup/ le tout dans le fichier config.ini se trouvant dans /etc/incase/

Actuellement l’erreur retournée par ma machine est :

sed: -e expression n°1, caractère 73: commande `s’ inachevée

J’ai essayé les \ etc mais rien à faire et je commence à me fatiguer :confounded:

Également j’ai testé :
sed -i "s/\(mysave *= *\).*/mysave = \/var\/incase\/backup\/" /etc/incase/config.ini

Merci pour votre aide :slight_smile:

Salut,

Il faut être bien rigoureux avec la syntaxe et les \ :
sed -i "s/mysave = %\\\(here\\\)s\/backup\//mysave = \/var\/incase\/backup\//g" /etc/incase/config.ini

Merci de la réponse :slight_smile:
Désolée de ma non culture mais pourquoi 3 \ ?

@lsam Ta commande me renvois exactement la même erreur :
sed: -e expression n°1, caractère 70: commandes’ inachevée`

Les \ permettent de considérer le caractère suivant comme un vrai caractère et non de l’interpréter comme une commande potentielle.
Exemple :
pour le caractère / il faut écrire \/, sinon il confond avec la syntaxe "s///g" de la commande
pour le caractère \, idem : \\
pour (, idem : \(

Donc si tu as les caractères %\(, il faut taper %\\\(

Du coup ça devrait-être
sed -i “s/mysave = %(here)s/backup//mysave = /var/incase/backup//g” /etc/incase/config.ini

De plus la partie //mysave = \/var\/incase me parait étrange :confused:

Tu peux répéter quel texte tu veux remplacer exactement ? Il ne faut pas oublier de mettre \( pour les parenthèses…

Sinon, j’ai testé, ma commande fonctionne très bien.

Relis bien : dans \//mysave, / sert à indiquer le caractère /, le second / fait partie de la commande de substitution de sed : sed "s/texte_à_remplacer/nouveau_texte/g" fichier !

Salut Solène,

Si tu veux modifier “mysave = %\(here\)s/backup/” par “mysave = /var/incase/backup/” tu peux utiliser la commande suivante : sed -i ‘s/mysave = %\\(here\\)s/backup//mysave = /var/incase/backup//g’ /etc/incase/config.ini

Si ce que tu souhaites modifier est “mysave = %(here)s/backup/” par “mysave = /var/incase/backup/” alors tu peux utiliser la commande : sed -i ‘s/mysave = %(here)s/backup//mysave = /var/incase/backup//g’ /etc/incase/config.ini

Dis moi si cela répond à ton problème !

Du coup j’ai “bidouillé” un moment et j’ai fini par réussir en faisant :

sed -i 's/\(mysave *= *\).*/mysave = \/var\/incase\/backup/g' /etc/incase/config.ini

Merci pour votre aide :smiley:

salut,

sinon, tu changes le séparateur de commandes de sed :

@ peut être n’importe quel caractère ne figurant pas dans l’expression régulière, ou le motif de remplacement.

2 J'aime

Petit truc bon à savoir, c’est noté !
Merci :wink: