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

Signaler
Messages postés
1569
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
-
Messages postés
35028
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
6 juillet 2020
-
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.

3 réponses

Messages postés
35028
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
6 juillet 2020
5 253
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63497 internautes nous ont dit merci ce mois-ci

Messages postés
213
Date d'inscription
jeudi 13 décembre 2018
Statut
Membre
Dernière intervention
27 septembre 2019
14
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
Messages postés
35028
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
6 juillet 2020
5 253 >
Messages postés
213
Date d'inscription
jeudi 13 décembre 2018
Statut
Membre
Dernière intervention
27 septembre 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.
Messages postés
1569
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
254
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
Messages postés
35028
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
6 juillet 2020
5 253 >
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é ;-\
Messages postés
1569
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
254
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 !
Messages postés
1569
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
30 avril 2019
254
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 !
Messages postés
35028
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
6 juillet 2020
5 253
La seule référence que j'ai concernant "ed" c'est Editing files via scripts with ed