Utilisation de sed avec #

Résolu/Fermé
Lapourax Messages postés 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 - Modifié par Lapourax le 26/06/2013 à 11:07
Lapourax Messages postés 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 - 26 juin 2013 à 15:05
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
26 juin 2013 à 11:24
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 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 334
26 juin 2013 à 11:31
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
26 juin 2013 à 11:34
Avec un exemple concret on pourrait davantage cerner ton problème ;-(
0
Lapourax Messages postés 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 334
Modifié par Lapourax le 26/06/2013 à 11:45
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
26 juin 2013 à 11:51
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 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 334
26 juin 2013 à 11:55
Je vais y arriver '-_-
Bouge pas je t'envoi sa
0
Lapourax Messages postés 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 334
26 juin 2013 à 11:57
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
26 juin 2013 à 11:58
Et elle doit être modifiée comment ?
0
Lapourax Messages postés 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 334
26 juin 2013 à 11:59
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 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 334
26 juin 2013 à 15:05
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