Utilisation de sed avec #
Résolu
Lapourax
Messages postés
3014
Date d'inscription
Statut
Contributeur
Dernière intervention
-
Lapourax Messages postés 3014 Date d'inscription Statut Contributeur Dernière intervention -
Lapourax Messages postés 3014 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour CCM,
J'ai un souci avec un sed. Dans un script, en fonction de certains paramètres, je dois commenter des lignes avec des # dans un fichier. Mon code ressemble donc a peu prés à sa :
Mon problème c'est que quand la condition veut que la chaine contienne # j'ai l'erreur suivante
J'ai logiquement pensé que le # commente la fin de la ligne de commande...
J'ai essayé de mettre un \ pour dé-spécialiser le # mais sa marche pas...
Merci d'avance pour vos réponses !
Si vous ne réussissez pas du premier coup, appelez ça version 1.0
J'ai un souci avec un sed. Dans un script, en fonction de certains paramètres, je dois commenter des lignes avec des # dans un fichier. Mon code ressemble donc a peu prés à sa :
if [ condition ]; then chaine="# " else chaine = "" fi sed -e s%${chaine_fichier}%${chaine}%g fichier > fichier2
Mon problème c'est que quand la condition veut que la chaine contienne # j'ai l'erreur suivante
sed: -e expression #5, char 16: unterminated 's' command
J'ai logiquement pensé que le # commente la fin de la ligne de commande...
J'ai essayé de mettre un \ pour dé-spécialiser le # mais sa marche pas...
Merci d'avance pour vos réponses !
Si vous ne réussissez pas du premier coup, appelez ça version 1.0
A voir également:
- Utilisation de sed avec #
- Utilisation chromecast - Guide
- Télécharger gratuitement notice d'utilisation - Guide
- La ressource demandée est en cours d'utilisation ✓ - Forum Logiciels
- Family link temps d'utilisation ne fonctionne pas - Forum Contrôle parental
- Impossible d'utiliser ce numéro de téléphone pour la validation - Forum Gmail
4 réponses
Salut,
Déjà mettre des quotes doubles autour de l'expression serait plus orthodoxe ;-))
Que contient ta variable "${chaine_fichier}" ?
Sinon, même si ta syntaxe fonctionnait, dans le cas où "${chaîne}" vaudrait "#", c'est toute ta "${chaine_fichier}" qui serait remplacée par un dièse, et dans le cas contraire elle serait entièrement effacée ;-(
La bonne syntaxe :
Si ta version de sed l'accepte, utilise l'option "-i.bak" qui permet de faire les modifications directement dans le fichier d'origine tout en créant une copie avec l'extension ".bak".
De même, il est fort possible que tu puisses tout faire avec sed, tout dépend de la condition dans ton test (if [ condition ]...) ;-\
Déjà mettre des quotes doubles autour de l'expression serait plus orthodoxe ;-))
Que contient ta variable "${chaine_fichier}" ?
Sinon, même si ta syntaxe fonctionnait, dans le cas où "${chaîne}" vaudrait "#", c'est toute ta "${chaine_fichier}" qui serait remplacée par un dièse, et dans le cas contraire elle serait entièrement effacée ;-(
La bonne syntaxe :
sed '/motif/{s/^/chaine/}' fichierAdapté à ton cas ça donne :
sed -e "\%${chaine_fichier}%{s%^%${chaine}%}" fichier > fichier2
Si ta version de sed l'accepte, utilise l'option "-i.bak" qui permet de faire les modifications directement dans le fichier d'origine tout en créant une copie avec l'extension ".bak".
De même, il est fort possible que tu puisses tout faire avec sed, tout dépend de la condition dans ton test (if [ condition ]...) ;-\
En fait "fichier" contient des lignes qui commencent par une chaîne de caractère prédéfinie
Selon la condition je laisse ces lignes (=suppression de la chaine en début de ligne) soit je la commente (=remplacement par #)
La chaine "chaine_fichier" c'est un truc du genre ##debut_ligne## (avec lui aussi des # mais je peu pas changer sa)
Ce qui m'étonne c'est que j'ai deja fait des sed avec des #
Je vais tester ta syntaxe =)
Selon la condition je laisse ces lignes (=suppression de la chaine en début de ligne) soit je la commente (=remplacement par #)
La chaine "chaine_fichier" c'est un truc du genre ##debut_ligne## (avec lui aussi des # mais je peu pas changer sa)
Ce qui m'étonne c'est que j'ai deja fait des sed avec des #
Je vais tester ta syntaxe =)
je complète alors =)
mon fichier et un template, c'est a dire que je ne le modifie pas je crée un autre fichier
Les lignes concernées commencent par une chaine de caractère (##DEBUT_LIGNE##) Comme cette chaine contient des #, je la variablilise
Dans une condition préalable je définie une variable qui viendra remplacer cette chaine de caractères
Puis je fais mon sed
Avec la syntaxe proposée par zipe31
Et maintenant l'erreur est la suivante :
En espérant que sa puisse vous aider =)
Si vous ne réussissez pas du premier coup, appelez ça version 1.0
mon fichier et un template, c'est a dire que je ne le modifie pas je crée un autre fichier
Les lignes concernées commencent par une chaine de caractère (##DEBUT_LIGNE##) Comme cette chaine contient des #, je la variablilise
chaine_origine="##DEBUT_LIGNE##"
Dans une condition préalable je définie une variable qui viendra remplacer cette chaine de caractères
if [ condition ]; then chaine_replace="# " else chaine_replace=" " fi
Puis je fais mon sed
sed -e s%${chaine_origine}%{s%^%${chaine_replace}%}%g fichier > fichier_destination
Avec la syntaxe proposée par zipe31
Et maintenant l'erreur est la suivante :
sed: -e expression #5, char 18: unknown option to 's'
En espérant que sa puisse vous aider =)
Si vous ne réussissez pas du premier coup, appelez ça version 1.0
Avec la syntaxe proposée par zipe31
Euh... non, tu n'as pas utilisé ma syntaxe, tu as modifié la tienne, mais mal ;-((
Il y a une erreur dans la substitution depuis le début, et la cause en est sûrement un caractère, peut être un caractère qui correspond au délimiteur de sed, mais sans voir à la fois ton fichier template, et la chaîne en entier, difficile de t'aider ;-(
D'où ma demande de voir ton fichier ;-\
Euh... non, tu n'as pas utilisé ma syntaxe, tu as modifié la tienne, mais mal ;-((
Il y a une erreur dans la substitution depuis le début, et la cause en est sûrement un caractère, peut être un caractère qui correspond au délimiteur de sed, mais sans voir à la fois ton fichier template, et la chaîne en entier, difficile de t'aider ;-(
D'où ma demande de voir ton fichier ;-\