[Shell] Ajout d'un bloc texte dans une fichier via script shell
Résolu
Doudou95
Messages postés
1897
Statut
Membre
-
zipe31 Messages postés 38797 Statut Contributeur -
zipe31 Messages postés 38797 Statut Contributeur -
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.
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:
- [Shell] Ajout d'un bloc texte dans une fichier via script shell
- Classic shell - Télécharger - Personnalisation
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
3 réponses
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 :
Le fichier devant recevoir le bloc :
La syntaxe de "ed" :
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 :
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'
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 !
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 !
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 !
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 !
sed '/pattern/ { h r /chemin/fichier_a_inserer g N }' fichierAmodifiermais je ne l'aurais pas sorti tout seul : https://stackoverflow.com/questions/11243102/using-sed-to-insert-file-content/11246712#11246712
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.
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 :