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   -
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 :

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

4 réponses

zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
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 :
sed '/motif/{s/^/chaine/}' fichier
Adapté à 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 ]...) ;-\
1
Lapourax Messages postés 3014 Date d'inscription   Statut Contributeur Dernière intervention   334
 
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 =)
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
Avec un exemple concret on pourrait davantage cerner ton problème ;-(
0
Lapourax Messages postés 3014 Date d'inscription   Statut Contributeur Dernière intervention   334
 
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
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
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
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 ;-\
0
Lapourax Messages postés 3014 Date d'inscription   Statut Contributeur Dernière intervention   334
 
Je vais y arriver '-_-
Bouge pas je t'envoi sa
0
Lapourax Messages postés 3014 Date d'inscription   Statut Contributeur Dernière intervention   334
 
La ligne du fichier à modifier ressemble à sa :
##DEBUT_LIGNE##Expression /liege-bouchon/connectPortail*

Elles ont toute le même format (Expression/xxxxx-xxxx/xxxxxx*)
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
Et elle doit être modifiée comment ?
0
Lapourax Messages postés 3014 Date d'inscription   Statut Contributeur Dernière intervention   334
 
Apres le fichier est un format qui ressemble à de l'xml avec des balises et des metacaractère a plus savoir quoi en faire...
0
Lapourax Messages postés 3014 Date d'inscription   Statut Contributeur Dernière intervention   334
 
En fait tu as donné la solution dans la toute première ligne de ta première réponse
Le pb venait bien des doubles cotes...
Mea culpa désolé de t'avoir fait perdre du temps :-/
0