bash ajout du contenu d'un fichier dans un deuxième fichier sed

a marqué ce sujet comme résolu.

Salut

J’ai besoin d’aide pour un script bash. J’aimerai que mon programme prennent en entrée deux paramètres, le premier est un fichier html, le second un répertoire contenant des fichiers qui vont être modifier.

Le but est de rajouter une image (donc de l’html) à des signatures de mails. Il faut donc ajouter le contenu du fichier 1 dans tous les fichiers du répertoire indiqué par l’argument 2 juste avant la fin du body.

#!/bin/bash

usage () {
    echo "wrong usage, you should provid a starting path"
    echo 
    echo "use this script as such : $0  <html file who's content will be added to each signatures> <path to directory containing html signature>" 
    exit -1
}
if [ $# -ne 2 ]
then
    usage
fi

h=$1
if [ ! -f $1 ] || [[ ${h: -5} != ".html" ]]; then
    usage
fi

#find provide a recursive method to list everything 
files=$(find $2)

#process files
for file in $files
do
    if [[ ${file: -5} == ".html" ]]
    then
        #sed -i "/<\/body>/r./$2" $file #print after </body>

        #awk '/<\/body>/ { system ( "cat $2" ) } \
        #    { print; } \' "$file"   
        #sed -e "/<\/body>/r $1" $file
        #sed -n -e "/<\/body>/r $1" -e 1x -e '2,${x;p}' -e '${x;p}' $file 
        sed -n -e '/<\/body>/r '"$1" -e 1x -e '2,${x;p}' -e '${x;p}' $file

    fi  
done

Mais aucune des commandes dans ma boucle ne fonctionne malgré les indications SO: Quelqu’un aurait une solution ?

merci d’avance

+0 -0

Salut,

Si j’ai bien saisi, tu souhaites insérer le texte présent dans un fichier à la suite de la balise </body> de plusieurs fichiers HTML ? Si oui, je ne comprends pas très bien ton utilisation de sed, car :

  1. L’option -n va supprimer la sortie pour n’afficher que l’insertion ;
  2. Pourquoi utilises-tu la commande x sans avoir utilisé la commande h au préalable ?
  3. Qu’essayes-tu de faire avec tes suites de commandes après '/<\/body>/r '"$1" ?

Sinon, tu peux t’en sortir avec cette commande, normalement.

$ sed '/<[/]body>/r fichier' repertoire/*.html

Si tu souhaites modifier les fichiers html, utilises l’option -i.

+0 -0

j’ai un répertoire comme ça

+ script.sh  
+ htmlToAdd.html
+ dir/  
      - signature.html
      - signature2.html
      - repertoir/
           -autre fichiers, dossier
      ...

avec dans htmlToAdd.html

<p>
   <img src="url.com" alt="alt text" >
</p>

j’aimerais ajouter l’html ci-dessus dans tout les fichiers html présent sous le répertoire indiqué par le deuxième argument. l’image doit s’ajouter correctement dans l’html déjà présent c’est à dire juste avant le tag </body> le problème actuel c’est que mon html s’ajoute après le tag et donc ne s’affiche pas correctement.

@adri1 en effet, je devais être fatigué
@Taurre, ta solution place l’html après le tag non ?

La suite de commande bizarre dans le sed sert normalement (d’après le SO ou je l’ai piqué) à retarder l’affichage afin que le html a ajouter soit placé devant le tag et non après.

J’ai pas mon ordi de boulot avec moi, je teste tout ça lundi

+0 -0

j’aimerais ajouter l’html ci-dessus dans tout les fichiers html présent sous le répertoire indiqué par le deuxième argument. l’image doit s’ajouter correctement dans l’html déjà présent c’est à dire juste avant le tag </body> le problème actuel c’est que mon html s’ajoute après le tag et donc ne s’affiche pas correctement.

d3m0t3p

Aah ! Ok, je n’avais pas compris que tu souhaitais insérer la signature avant la balise </body>. Pour faire cela, tu peux essayer avec un multiline pattern. Pour l’explication : par défaut, sed lit une ligne en entrée, la place dans un tampon appelé le pattern space et effectue les opérations demandées dessus (substitution, translitération, affichage, etc.). Toutefois, il est possible de modifier ce comportement en plaçant plusieurs lignes dans le pattern space.

Pour ce faire, on utilise en général la suite de commandes N, P et D. La commande N demande à sed de lire une ligne et de l’ajouter au pattern space précédée d’un retour à la ligne \n. Le contenu du pattern space devient alors première ligne\ndeuxième ligne\n. La particularité est que seul le ou les \n séparant les lignes seront détectés par un \n dans les regexps, le retour à la ligne finale étant uniquement détecté par $.

La commande P affiche le contenu du pattern space jusqu’à rencontrer un \n. La commande D supprime le contenu du pattern space jusqu’à rencontrer un \n et fait boucler le script (autrement dit, elle provoque le retour au début du script). Ainsi, il est possible d’afficher le contenu d’un fichier comme suit.

$ sed '$!N;P;D' fichier.txt

La commande N est précédée de $! afin d’éviter que la dernière ligne du fichier ne soit pas affichée (N n’ayant plus de ligne à lire, sed quitte immédiatement).

L’avantage de cette technique est qu’elle te permet de voir venir la balise </body> et donc d’afficher la signature au bon moment.

$ cat script.sed
$!N
/[^\n]+\n<[/]body>/ {
        P
        r footer.txt
        D
}
P
D

$ cat test.html
<body>
        <a></a>
        <p></p>
</body>
<!-- Fin -->

$ cat footer.txt
Signature

$ sed -E -f script.sed test.html
<body>
        <a></a>
        <p></p>
Signature
</body>
<!-- Fin -->

Note que cela ne marche pas si la balise </body> se trouve être la dernière ligne de ton fichier.

+0 -0

Salut,

Tu dois pouvoir t’en sortir avec ed (line editor linux), ci-dessous file1 est le fichier à éditer et file2 le fichier à insérer:

ed -s file1 <<EIN
/<\/body>/-r file2
w
q
EIN

Cela insère le contenu du fichier file2 avant le premier pattern </body> trouvé (g/<\body>/ le fera pour tous les patterns trouvés), écrit le fichier file1 et quitte l’éditeur.

Exemple:

$ cat file1
<body>
<p>
Paragraphe 1
</p>
</body>

$ cat file2
<p>
Paragraphe 2
</p>

$ ed -s file1 <<EIN
/<\/body>/-r file2
w
q
EIN

$ cat file1
<body>
<p>
Paragraphe 1
</p>
<p>
Paragraphe 2
</p>
</body>

EDIT: tu peux aussi voir le résultat de la commande sur la sortie standard au lieu d’écrire dans le fichier en remplacant "w" qui sauvegarde le fichier en place par ",p" (coller le buffer).

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte