Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2019-11-10T11:05:48+01:00Les derniers messages parus sur le forum de Zeste de Savoir.bash ajout du contenu d'un fichier dans un deuxième fichier sed, message #2108342019-11-10T11:05:48+01:00fromvega/@fromvegahttps://zestedesavoir.com/forums/sujet/13195/bash-ajout-du-contenu-dun-fichier-dans-un-deuxieme-fichier-sed/?page=1#p210834<p>Salut,</p>
<p>Tu dois pouvoir t’en sortir avec ed (line editor linux), ci-dessous file1 est le fichier à éditer et file2 le fichier à insérer:</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-bash">ed -s file1 <<EIN
/<\/body>/-r file2
w
q
EIN
</code></pre></div>
<p>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.</p>
<p>Exemple:</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-bash">$ 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>
</code></pre></div>
<p>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).</p>bash ajout du contenu d'un fichier dans un deuxième fichier sed, message #2108252019-11-09T21:28:34+01:00Taurre/@Taurrehttps://zestedesavoir.com/forums/sujet/13195/bash-ajout-du-contenu-dun-fichier-dans-un-deuxieme-fichier-sed/?page=1#p210825<figure><blockquote>
<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.</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/13195/bash-ajout-du-contenu-dun-fichier-dans-un-deuxieme-fichier-sed/?page=1#p210799">d3m0t3p</a></figcaption></figure>
<p><em>Aah</em> ! Ok, je n’avais pas compris que tu souhaitais insérer la signature <em>avant</em> la balise <code></body></code>. Pour faire cela, tu peux essayer avec un <em>multiline pattern</em>. Pour l’explication : par défaut, <code>sed</code> lit une ligne en entrée, la place dans un tampon appelé le <em>pattern space</em> 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 <em>pattern space</em>.</p>
<p>Pour ce faire, on utilise en général la suite de commandes <code>N</code>, <code>P</code> et <code>D</code>. La commande <code>N</code> demande à <code>sed</code> de lire une ligne et de l’ajouter au <em>pattern space</em> précédée d’un retour à la ligne <code>\n</code>. Le contenu du <em>pattern space</em> devient alors <code>première ligne\ndeuxième ligne\n</code>. La particularité est que seul le ou les <code>\n</code> séparant les lignes seront détectés par un <code>\n</code> dans les regexps, le retour à la ligne finale étant uniquement détecté par <code>$</code>.</p>
<p>La commande <code>P</code> affiche le contenu du <em>pattern space</em> jusqu’à rencontrer un <code>\n</code>. La commande <code>D</code> supprime le contenu du <em>pattern space</em> jusqu’à rencontrer un <code>\n</code> <em>et fait boucler le script</em> (autrement dit, elle provoque le retour au début du script). Ainsi, il est possible d’afficher le contenu d’un fichier comme suit.</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span></div><pre><code class="hljs language-sh">$ sed <span class="hljs-string">'$!N;P;D'</span> fichier.txt
</code></pre></div>
<p>La commande <code>N</code> est précédée de <code>$!</code> afin d’éviter que la dernière ligne du fichier ne soit pas affichée (<code>N</code> n’ayant plus de ligne à lire, <code>sed</code> quitte immédiatement).</p>
<p>L’avantage de cette technique est qu’elle te permet de voir venir la balise <code></body></code> et donc d’afficher la signature au bon moment.</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-text">$ 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 -->
</code></pre></div>
<p>Note que cela ne marche pas si la balise <code></body></code> se trouve être la dernière ligne de ton fichier.</p>bash ajout du contenu d'un fichier dans un deuxième fichier sed, message #2107992019-11-09T16:28:40+01:00d3m0t3p/@d3m0t3phttps://zestedesavoir.com/forums/sujet/13195/bash-ajout-du-contenu-dun-fichier-dans-un-deuxieme-fichier-sed/?page=1#p210799<p>j’ai un répertoire comme ça </p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-haml">+ script.sh
+ htmlToAdd.html
+ dir/
-<span class="ruby"> signature.html
</span> -<span class="ruby"> signature2.html
</span> -<span class="ruby"> repertoir/
</span> -<span class="ruby">autre fichiers, dossier
</span> ...
</code></pre></div>
<p>avec dans htmlToAdd.html</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span></div><pre><code class="hljs language-javascript"><p>
<span class="xml"><span class="hljs-tag"><<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"url.com"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"alt text"</span> ></span>
<span class="hljs-tag"></<span class="hljs-name">p</span>></span></span>
</code></pre></div>
<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.</p>
<p><a href="/membres/voir/adri1/" rel="nofollow" class="ping ping-link">@<span class="ping-username">adri1</span></a> en effet, je devais être fatigué<br>
<a href="/membres/voir/Taurre/" rel="nofollow" class="ping ping-link">@<span class="ping-username">Taurre</span></a>, ta solution place l’html après le tag non ? </p>
<p>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.</p>
<p>J’ai pas mon ordi de boulot avec moi, je teste tout ça lundi</p>bash ajout du contenu d'un fichier dans un deuxième fichier sed, message #2107162019-11-08T00:14:57+01:00adri1/@adri1https://zestedesavoir.com/forums/sujet/13195/bash-ajout-du-contenu-dun-fichier-dans-un-deuxieme-fichier-sed/?page=1#p210716<p>Salut,</p>
<p>C’est pas une réponse directe, mais une remarque en passant…</p>
<blockquote>
<p>html file who’s content will be added to each signatures</p>
</blockquote>
<p>C’est <em>whose</em>, pas <em>who is</em> ni <em>who has</em> ; et c’est <em>each signature</em> au singulier.</p>bash ajout du contenu d'un fichier dans un deuxième fichier sed, message #2107082019-11-07T20:43:16+01:00Taurre/@Taurrehttps://zestedesavoir.com/forums/sujet/13195/bash-ajout-du-contenu-dun-fichier-dans-un-deuxieme-fichier-sed/?page=1#p210708<p>Salut,</p>
<p>Si j’ai bien saisi, tu souhaites insérer le texte présent dans un fichier à la suite de la balise <code></body></code> de plusieurs fichiers HTML ? Si oui, je ne comprends pas très bien ton utilisation de <code>sed</code>, car :</p>
<ol>
<li>L’option <code>-n</code> va supprimer la sortie pour n’afficher que l’insertion ;</li>
<li>Pourquoi utilises-tu la commande <code>x</code> sans avoir utilisé la commande <code>h</code> au préalable ?</li>
<li>Qu’essayes-tu de faire avec tes suites de commandes après <code>'/<\/body>/r '"$1"</code> ?</li>
</ol>
<p>Sinon, tu peux t’en sortir avec cette commande, normalement.</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span></div><pre><code class="hljs language-sh">$ sed <span class="hljs-string">'/<[/]body>/r fichier'</span> repertoire/*.html
</code></pre></div>
<p>Si tu souhaites modifier les fichiers <code>html</code>, utilises l’option <code>-i</code>.</p>bash ajout du contenu d'un fichier dans un deuxième fichier sed, message #2106932019-11-07T16:01:11+01:00d3m0t3p/@d3m0t3phttps://zestedesavoir.com/forums/sujet/13195/bash-ajout-du-contenu-dun-fichier-dans-un-deuxieme-fichier-sed/?page=1#p210693<p>Salut</p>
<p>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.</p>
<p>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.</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-bash"><span class="hljs-meta">#!/bin/bash
</span>
<span class="hljs-function"><span class="hljs-title">usage</span></span> () {
<span class="hljs-built_in">echo</span> <span class="hljs-string">"wrong usage, you should provid a starting path"</span>
<span class="hljs-built_in">echo</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"use this script as such : <span class="hljs-variable">$0</span> <html file who's content will be added to each signatures> <path to directory containing html signature>"</span>
<span class="hljs-built_in">exit</span> -1
}
<span class="hljs-keyword">if</span> [ <span class="hljs-variable">$#</span> -ne 2 ]
<span class="hljs-keyword">then</span>
usage
<span class="hljs-keyword">fi</span>
h=<span class="hljs-variable">$1</span>
<span class="hljs-keyword">if</span> [ ! -f <span class="hljs-variable">$1</span> ] || [[ <span class="hljs-variable">${h: -5}</span> != <span class="hljs-string">".html"</span> ]]; <span class="hljs-keyword">then</span>
usage
<span class="hljs-keyword">fi</span>
<span class="hljs-comment">#find provide a recursive method to list everything </span>
files=$(find <span class="hljs-variable">$2</span>)
<span class="hljs-comment">#process files</span>
<span class="hljs-keyword">for</span> file <span class="hljs-keyword">in</span> <span class="hljs-variable">$files</span>
<span class="hljs-keyword">do</span>
<span class="hljs-keyword">if</span> [[ <span class="hljs-variable">${file: -5}</span> == <span class="hljs-string">".html"</span> ]]
<span class="hljs-keyword">then</span>
<span class="hljs-comment">#sed -i "/<\/body>/r./$2" $file #print after </body></span>
<span class="hljs-comment">#awk '/<\/body>/ { system ( "cat $2" ) } \</span>
<span class="hljs-comment"># { print; } \' "$file" </span>
<span class="hljs-comment">#sed -e "/<\/body>/r $1" $file</span>
<span class="hljs-comment">#sed -n -e "/<\/body>/r $1" -e 1x -e '2,${x;p}' -e '${x;p}' $file </span>
sed -n -e <span class="hljs-string">'/<\/body>/r '</span><span class="hljs-string">"<span class="hljs-variable">$1</span>"</span> -e 1x -e <span class="hljs-string">'2,${x;p}'</span> -e <span class="hljs-string">'${x;p}'</span> <span class="hljs-variable">$file</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">done</span>
</code></pre></div>
<p>Mais aucune des commandes dans ma boucle ne fonctionne malgré <a href="https://unix.stackexchange.com/questions/32908/how-to-insert-the-content-of-a-file-into-another-file-before-a-pattern-marker#32912">les indications SO: </a>
Quelqu’un aurait une solution ?</p>
<p>merci d’avance</p>