2011-10-07 4 views
0

Je viens de commencer à apprendre sed. Je veux extraire et imprimer les caractères entre les délimiteurs> et <. Voici le texte dans mon fichier de données:Comment extraire des caractères entre les délimiteurs en utilisant sed?

<span id="ctl00_ContentPlaceHolder1_lblRollNo">12029</span> 

    <br /><b>Engineering & IT/Computer Science</b><br /> 

     <div id="ctl00_ContentPlaceHolder1_divEngITMerit"> 

         <span id="ctl00_ContentPlaceHolder1_lblEngITSelListNo">3rd Provisional Selection List</span> 

       <tr><td style='width: 200px' class='TblTRData'>IT/Computer Science/Software</td><td style='width: 150px'class='TblTRData'>7 (out of 471)</td><td style='width: 325px'class='TblTRData'>Selected in MS COMPUTER SCIENCE</td></tr> 

           Name: 

           <span id="ctl00_ContentPlaceHolder1_lblName">SIDRA SHAHID</span> 

           Father Name: 

           <span id="ctl00_ContentPlaceHolder1_lblFatherName">SHAHID RAFEEQ AHMAD</span> 

J'ai écrit la commande:

sed -n -e '/^[^>]*>\([^<]*\)<.*/s//\1/p' myfile.txt 

Le problème est qu'il renvoie le texte entre une partie de la> <. Par exemple, il imprime , mais non sélectionné dans sélectionné dans MS SCIENCE INFORMATIQUE. Qu'est-ce que je fais mal?

+3

vous devriez utiliser un analyseur XML à la place. Que faire si vous avez des entités à l'intérieur? – Benoit

+0

Je vais laisser tomber ce lien dans les commentaires au cas où quelqu'un trouverait utile: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/ 1732454 # 1732454 – Johnsyweb

Répondre

0

Dans sed, la commande s a un indicateur g pour fonctionner sur toutes les occurrences de modèle sur une même ligne.

s/>\([^<]*\)</\1/pg 

peut suffire.

+0

merci monsieur mais il ne fonctionne toujours pas :( – mainajaved

+0

@ mainajaved: et avec cette regex? – Benoit

+0

@mainajavaed: À moins que votre script sed est invoqué avec l'option '-n', vous pouvez essayer de supprimer le« p »à la Cela signifie que vous devez imprimer, donc à chaque fois que vous avez une correspondance réussie, la ligne est imprimée, ce qui, si vous ne disposez pas de l'option '-n', peut mener à une sortie confuse. Le lien entre le commentaire original de Johnsweb et Benoit et l'analyse de XML avec n'importe quel outil reg-ex n'aura jamais de succès à long terme Si vous essayez d'apprendre sed, ce n'est vraiment pas le genre de sujet pour commencer à apprendre avec bonne chance. – shellter

1

Si vous devez extraire uniquement des chaînes entre les balises, cela signifie que vous devez supprimer les balises en conservant les chaînes entre elles. Droite?

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

Il remplace (toutes les occurrences) de l'étiquette (tout "<" à côté ">") avec une chaîne vide (rien). Le texte restera.

Questions connexes