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

Résolu/Fermé
Doudou95 Messages postés 1561 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 30 avril 2019 - 29 avril 2019 à 16:34
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 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.
A voir également:

3 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
29 avril 2019 à 19:20
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'


1
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13
29 avril 2019 à 23:38
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/questions/11243102/using-sed-to-insert-file-content/11246712#11246712
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415 > lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022
30 avril 2019 à 08:20
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.
0
Doudou95 Messages postés 1561 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 30 avril 2019 275
30 avril 2019 à 10:09
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
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415 > Doudou95 Messages postés 1561 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 30 avril 2019
30 avril 2019 à 10:14
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é ;-\
0
Doudou95 Messages postés 1561 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 30 avril 2019 275
29 avril 2019 à 19:26
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 !
0
Doudou95 Messages postés 1561 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 30 avril 2019 275
29 avril 2019 à 20:53
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 !
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
30 avril 2019 à 08:21
La seule référence que j'ai concernant "ed" c'est Editing files via scripts with ed
0