Menu

[Shell] Ajout d'un bloc texte dans une fichier via script shell [Résolu]

Messages postés
1569
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
- - Dernière réponse : zipe31
Messages postés
36526
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
21 mai 2019
- 30 avril 2019 à 10:14
Bonjour,

Je suis actuellement en train d'essayer d'automatiser par script l'ajout de conf de nouveaux flux dans le fichier de conf global.

Le bloc de texte est de la forme :
REF_FLUX)\ #DESCRIPTION DU FLUX
ENTITE="XX"
RETENTION=XX
PARTNER="XX"
FLOWLABEL="XX XX XX"
TOPMAIL=X
DESTINATAIRES="XX@XX.XXX"
OBJET_MAIL="XX XXX XX"
CORPS_MAIL="XX XXX XX"
PIECE_JOINTE_MAIL="XX";;

Le bloc que je veux rajouter est à ajouter avant *) juste avec la fin du case.
Il comporte des caractères spéciaux dont des guillemets (#,),",...) et des espaces.
Le bloc à importer est renseigné dans une variable à passer dans le sed.
(j'ai essayé avec un bloc complet dans la variable, ou en faisant une boucle for ligne in (cat mon fichier))

J'ai fait quelques recherches et beaucoup de tests en vain avec ce que j'ai trouvé, à savoir utiliser
sed -i '/*)/i\$bloc_de_texte' mon_fichier

Le problème avec la commande actuelle est qu'à chaque espace, ça me fait un saut de ligne.
J'avoue que je commence un peu à me décourager. après avoir joué avec les ', les ", les {} et les \.

Auriez vous la syntaxe exacte correcte de la ligne de commande pour insérer le bloc dans mon fichier?

Merci d'avance de votre retour.
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Messages postés
36526
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
21 mai 2019
3544
1
Merci
Salut,

Avec sed ça risque d'être coton, surtout que l'option d'insertion (ou d'ajout) n'aime pas trop les sauts de lignes.

Le passage via une variable n'est pas fait non plus pour faciliter les choses ;-\


Une solution quand même avec "ed" et un fichier à la place de la variable…

Le fichier contenant la partie à insérer :
$ cat fich 
REF_FLUX)\ #DESCRIPTION DU FLUX
ENTITE="XX"
RETENTION=XX
PARTNER="XX"
FLOWLABEL="XX XX XX"
TOPMAIL=X
DESTINATAIRES="XX@XX.XXX"
OBJET_MAIL="XX XXX XX"
CORPS_MAIL="XX XXX XX"
PIECE_JOINTE_MAIL="XX";;


Le fichier devant recevoir le bloc :
$ cat foo.sh 
#! /bin/bash

case $1 in
1) echo 1
;;
2) echo 2
;;
*) echo FIN
;;
esac


La syntaxe de "ed" :
$ ed -s foo.sh <<<$'H\n/\*)/-1 r fich\n,p'
#! /bin/bash

case $1 in
1) echo 1
;;
2) echo 2
;;
REF_FLUX)\ #DESCRIPTION DU FLUX
ENTITE="XX"
RETENTION=XX
PARTNER="XX"
FLOWLABEL="XX XX XX"
TOPMAIL=X
DESTINATAIRES="XX@XX.XXX"
OBJET_MAIL="XX XXX XX"
CORPS_MAIL="XX XXX XX"
PIECE_JOINTE_MAIL="XX";;
*) echo FIN
;;
esac


Si ça te donne satisfaction et que tu veux reproduire l'équivalent de l'option "-i" de "sed", change la fin de la syntaxe comme suit :
ed -s foo.sh <<<$'H\n/\*)/-1 r fich\nw'


Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 39456 internautes nous ont dit merci ce mois-ci

lEprofSonDkon
Messages postés
167
Date d'inscription
jeudi 13 décembre 2018
Statut
Membre
Dernière intervention
22 mai 2019
6 -
ce n'est pas si compliqué :
sed '/pattern/ {
         h
         r /chemin/fichier_a_inserer
         g
         N
     }' fichierAmodifier

mais je ne l'aurais pas sorti tout seul : https://stackoverflow.com/a/11246712
zipe31
Messages postés
36526
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
21 mai 2019
3544 > lEprofSonDkon
Messages postés
167
Date d'inscription
jeudi 13 décembre 2018
Statut
Membre
Dernière intervention
22 mai 2019
-
Salut,

J'avais testé cette solution hier, sans succès, à la différence près, que je n'avais pas mis le "N" final, qui apparemment fait toute la différence ;-\

Merci.
Doudou95
Messages postés
1569
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
240 -
Bonjour,

Merci bien.
La commande ne fait qu'afficher le contenu du fichier avec le bloc.
J'ai du ajouter -i pour vraiment ajouter le bloc :

sed -i '/pattern/ {
h
r /chemin/fichier_a_inserer
g
N
}' fichierAmodifier
zipe31
Messages postés
36526
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
21 mai 2019
3544 > Doudou95
Messages postés
1569
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
-
J'ai du ajouter -i pour vraiment ajouter le bloc
Ben oui, mais comme nous ne sommes pas aussi téméraires que les apprentis sorciers de "sed", nous ne donnons jamais de code susceptible de faire de grosses conneries avant de l'avoir testé ;-\
Commenter la réponse de zipe31
Messages postés
1569
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
240
0
Merci
J'ai un peu honte de le dire mais je ne connais pas la commande ed bien que je l'ai croisé sur un forum tout à l'heure.

Dans mes tentatives initiales les sauts de lignes ne m'embêtaient pas trop, c'est vraiment ces satanés espaces qui se transformaient en saut de ligne.

Ce que tu m'a communiqué semble parfaitement correspondre au besoin.
Je te tiens au courant du résultat, je vais essayer de faire une VM car j'ai pas le pc du taff.

Je te tiens au courant, merci bien !
Commenter la réponse de Doudou95
Messages postés
1569
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
240
0
Merci
Le résultat est impeccable, je ferai des tests en live demain sur mon fichier de test.
As tu un lien dans tes favoris expliquant le niveau avancé de l'utilisation de cette commande afin de comprendre complètement la commande décortiquée?

J'ai vu un équivalent dans la journée sur lequel tu étais déjà intervenu avec sed.

En tous cas merci bien je vais enfin avancer. Au top !
zipe31
Messages postés
36526
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
21 mai 2019
3544 -
La seule référence que j'ai concernant "ed" c'est Editing files via scripts with ed
Commenter la réponse de Doudou95