首页 > 解决方案 > Delete string between 2 paterns on more than one line

问题描述

I want to get rid of everything between patterns "< >" including patterns using bash.

I have tried those sed commands, but it's not giving the result i want.

sed 's/<.*>//g'

sed -r 's/<[^ ][^ ]*>//g'

For instance

From:

<span class="tlf_cdefinition">Qui ordonne, dispose, met en ordre.</span> <span class="tlf_cexemple"><i>Le geste humain (...) renonce à prendre; il met la chose en place et la considère; tout est spectacle pour l'homme, et même son action. Non point doux par cela seul; redoutable au contraire par cette activité ordinnatrice </i>[<i>sic</i>] (<span class="tlf_cauteur"><span class="tlf_smallcaps">Alain</span></span><span class="tlf_ctitre">, <i>Propos</i></span><span class="tlf_cdate">, 1921</span>, p.271).</span><div class="tlf_parothers"><b>Rem.</b> On emploie de préférence auj., dans ce sens, <i>ordonnateur, -trice</i>.</div></div><div class="tlf_parah"><span class="tlf_cplan"><b>II. −&lt;/b></span> <span class="tlf_cemploi"><i>Subst. masc.</i></span> <div class="tlf_parah"><span class="tlf_cplan"><b>A. −&lt;/b></span> <span class="tlf_cdomaine"><i>LITURG.</i>,</span> <span class="tlf_cemploi"><i>vx.</i></span> <span class="tlf_cdefinition">Celui qui confère le sacrement d'un ordre ecclésiastique. (<span class="tlf_csource">Dict. <span class="tlf_smallcaps">xix</span><sup>e</sup>et <span class="tlf_smallcaps">xx</span><sup>e</sup>s.</span>).</span> </div><div class="tlf_parah"><span class="tlf_cplan"><b>B. −&lt;/b></span> <span class="tlf_cdomaine"><i>INFORMAT.</i></span> <span class="tlf_cdefinition">Machine algorithmique composée d'un assemblage de matériels correspondant à des fonctions spécifiques, capable de recevoir de l'information, dotée de mémoires à grande capacité et de moyens de traitement à grande vitesse, pouvant restituer tout ou partie des éléments traités, ayant la possibilité de résoudre des problèmes mathématiques et logiques complexes, et nécessitant pour son fonctionnement la mise en oeuvre et l'exploitation automatique d'un ensemble de programmes enregistrés.</span> <span class="tlf_csyntagme"><i>Éléments périphériques d'un ordinateur; adresse, console, pupitre d'un ordinateur; imprimante, mémoire d'un ordinateur;</i></span> <span class="tlf_csyntagme">

I want to keep only that:

Qui ordonne, dispose, met en ordre.Le geste humain (...) renonce à prendre; il met la chose en place et la considère; tout est spectacle pour l'homme, et même son action. Non point doux par cela seul; redoutable au contraire par cette activité ordinnatrice [] (Alain, Propos, 1921, p.271).Rem. On emploie de préférence auj., dans ce sens, ordonnateur, -trice.II. −Celui qui confère le sacrement d'un ordre ecclésiastique. (Dict. xixeet xxes.).B. −INFORMAT.Machine algorithmique composée d'un assemblage de matériels correspondant à des fonctions spécifiques, capable de recevoir de l'information, dotée de mémoires à grande capacité et de moyens de traitement à grande vitesse, pouvant restituer tout ou partie des éléments traités, ayant la possibilité de résoudre des problèmes mathématiques et logiques complexes, et nécessitant pour son fonctionnement la mise en oeuvre et l'exploitation automatique d'un ensemble de programmes enregistrés.Éléments périphériques d'un ordinateur; adresse, console, pupitre d'un ordinateur; imprimante, mémoire d'un ordinateur;

标签: regexbashsed

解决方案


As the comment by @Tom above alludes, using regex to parse HTML is generally evil. That being said, if you only have single level (non nested) HTML tags, then regex might work here. But, Sed's regex engine is not very powerful, as it does not support lazy dot. Here is a way to do this using Perl in the Bash:

echo "<span class=\"tlf_cdefinition\">Qui ordonne, dispose, met en ordre.</span> <h1>Hello World!</h1>"
    | perl -pe 's|<[^>]+>(.*?)</[^>]+>|\1|g'

This outputs:

Qui ordonne, dispose, met en ordre. Hello World!

推荐阅读