URL: https://linuxfr.org/forums/programmationautre/posts/sed-sur-plusieurs-lignes Title: Sed sur plusieurs lignes Authors: Egide Dey Date: 2014年08月26日T22:06:27+02:00 License: CC By-SA Tags: script_shell, sed et bash Score: 2 Bonjour, Utilisateur de sed depuis des lustres... il y a un truc que je n'arrive pas à faire... et qui me chicane vraiment. J'ai toujours contourné le problème avec du Perl, mais, cette fois, c'est pour de l'embarqué (en fait une raspberry pi que je ne contrôle pas) et je n'ai pas de Perl à disposition. ### Le problème ### J'ai de nombreux fichiers qui ont un nombre variable de lignes de la forme: ``` %!PostProc(Xhtml): 'bidule' 'capsule' ``` Mais il peut y avoir, avant, entre et après des lignes vides ou avec des espaces et/ou des tabulations. Je ne contrôle pas la chose... J'ai besoin d'introduire une ligne **après** toutes les lignes de commandes `%!PostProc.*`, mais **avant** la première ligne de texte. Mais je n'arrive pas à le faire... Dans ma logique, probablement foireuse, cela devrait faire l'affaire : ```bash sed -e 'N;s/\(^%!.*\n\n*\)\([^%]\)/1円ma ligne à insérer\n2円/' src/index.t2t ``` Ha, pour corser le tout... il peut y avoir des fichiers qui n'ont pas du tout de ligne en %!... Et dans ce cas, ma ligne doit être introduite avant toutes les autres... Sinon, je m'étais dit de simplement utiliser la commande i : ```bash sed -e '/^[%$]/ima ligne\n;Q' ``` Le Q étant sensé faire arrêter le script dès que la commande à trouvé une ligne sur laquelle s'exécuter. Mais comment faire comprendre à sed qu'il s'agit de la commande Q (ou q) et non pas d'un simple caractère ???? ### J’ai essayé : ### ```bash sed -e '/^[%$]/{ima ligne\n};Q' sed -e '/^[%$]/i{ma ligne\n};Q' sed -e '/^[%$]/"ima ligne\n";Q' ``` et plein d'autres, sans succès. ### J'ai lu ### J'ai passé des heures à chercher, à relire le man de sed et : - http://linuxfr.org/forums/linux-general/posts/motif-multi-lignes-avec-sed - https://linuxfr.org/forums/programmation-shell/posts/regex-de-recherche-de-lignes-coup%C3%A9es - https://www.gentoo.org/doc/fr/articles/l-sed1.xml - https://www.gentoo.org/doc/fr/articles/l-sed2.xml - https://www.gentoo.org/doc/fr/articles/l-sed3.xml - http://sed.sourceforge.net/sed1line_fr.html - http://sed.sourceforge.net/sedfaq.html - http://unix.stackexchange.com/questions/20322/replace-string-with-contents-of-a-file-using-sed - http://austinmatzko.com/2008/04/26/sed-multi-line-search-and-replace/ Le dernier lien semble être le jackpot, mais je n'ai pas réussi à le faire fonctionner dans mon cas... Petit problème, je suis une vraie bille en anglais... par contre si vous avez des liens en allemand ou en italien je les comprends sans problème. ### Résolution temporaire ### Le problème est momentanément réglé par se code dans un Makefile (c'est juste un extrait), ça fonctionne très bien, mais cela me colle la nausée à chaque fois que j'ouvre mon fichier... ```Makefile SRC =src/ OUT =out/ ${OUT}%.xhtml: ${SRC}%.t2t $(wildcard ${SRC}inc/template/*) @echo ""> $@.tmp @sed -n "/^%!.*/p" $> $@.tmp @echo -e "\n%!include: ''src/inc/template/header.xhtml''\n">> $@.tmp @sed "/^%!.*/d" $< | sed '/./,$$!d' | sed -e :a -e '/^\n*$$/{$$d;N;ba' -e '}'>> $@.tmp @echo -e "\n\n%!include: ''src/inc/template/footer.xhtml''">> $@.tmp @cat $@.tmp | txt2tags --no-rc -t xhtml --encoding=utf-8 --no-headers -q -i - -o $@ @rm $@.tmp @sed -i "s/£MDATE£/$(shell date "+%A %d %B %Y à %H:%M:%S" --date=@`stat --printf=%Y $<`)/" $@ ``` Un grand merci pour toute aide!!!

AltStyle によって変換されたページ (->オリジナル) /