2010-07-17 5 views
1

J'ai un problème particulier en remplaçant du texte dans un fichier XML en utilisant awk regex matching.Quel est le problème avec ce remplacement awg regex?

Les fichiers xml sont simples. Il y a un paragraphe de texte dans le nœud de chaque xml et le programme awk remplace ce texte par un autre paragraphe de texte choisi dans le fichier texte rtxt. Mais pour une raison quelconque, le texte dans rtxt (étiqueté '42') qui substitue le texte dans 42.xml ne produit pas la substitution correcte.

toxml.awk écrire à stdout. Il imprime d'abord le xml tel qu'il l'a lu, puis le résultat final remplacé.

J'ai en fait une collection de ces fichiers xml où je fais un remplacement avec du texte choisi à partir d'un rtxt plus long. Il se trouve que ce remplacement particulier (pour 42.xml) ne fonctionne pas. Au lieu du texte dans l'élément en cours de remplacement, une autre balise est imbriquée dans l'élément existant.


toxml.awk

BEGIN{ 
    srcfile = "rtxt" 
    FS = "|" 

    while (getline <srcfile) { 
    xmlfile = $1 ".xml" 
    rep = "<narrative>" $2 "</narrative>" 

    ## read in the xml file in one go. 
    ## (the last tag will be missing.) 
    RS = "</topic>" 
    FS = "</topic>" 

    getline <xmlfile 
    #print $0 
    close(xmlfile) 

    ## replace 
    subs = gsub(/<narrative>.*<\/narrative>/, rep, $0) 

    ## append the closing tag 
    subs = gsub(/[ \n\r\t]+$/, "\n</topic>", $0) 
    print $0 

    ## restore them before reading rtxt. 
    RS = "\n" 
    FS = "|" 
    } 

    close(srcfile) 
} 

RTXT

42 | Résultats montrant les détails des instituts de formation pour Java, et les entreprises informatiques qui offrent des solutions Java sont également considérés comme non pertinents. Java est un langage de programmation populaire développé chez Sun Microsystems. Je suis intéressé à connaître ce langage de programmation, et aussi à apprendre la programmation avec. Pour être pertinent, un résultat devrait donner des informations sur l'historique de Java & sur différentes versions de Java, et sur différents concepts en Java. C'est bon si je trouve des tutoriels pour apprendre le Java. Les résultats liés uniquement à Sun Microsystems mais pas à Java sont considérés comme non pertinents. J'aime trouver des articles qui traitent de ce langage de programmation et de ses différents concepts. & versions.


42.xml

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE topic SYSTEM "topic.dtd"> 
<topic id="2009042" ct_no="227"> 

    <title>sun java</title> 

    <castitle>//article[about(.//language, java) or about(.,sun)]//sec[about(.//language, java)]</castitle> 

    <phrasetitle>"sun java"</phrasetitle> 

    <description>Find information about Sun Microsystem's Java language</description> 

    <narrative>Java is a popular programming language developed at Sun Microsystems. I am interested to know about this programming language, and also to learn programming with it. To be relevant, a result should give information on history of Java &amp; on different versions of Java, and on different concepts in Java. Its good if I find tutorials for learning Java. Results related only to Sun Microsystems but not Java are considered non-relevant. Results showing details of training institutes for Java, and IT companies which provide Java solutions are also considered non-relevant. I like to find articles that discuss this programming language and various concepts &amp; versions of it. </narrative> 

</topic> 

+4

Je ne sais pas quelqu'un d'autre, mais je ne suis pas pour le téléchargement et l'extraction des fichiers de pour répondre à une question. Utilisez plutôt un service pastebin. –

+0

Même je pensais que ce ne serait pas la bonne façon de demander sur Stackoverflow, mais je n'ai aucun autre moyen de démontrer le problème. Fournir des liens vers les 4 fichiers serait un autre gâchis. J'ai besoin de trouver quelqu'un pour voir les fichiers texte et exécuter le programme. Je vais devoir trouver un autre moyen. – rup

+0

Une chose qui semble évidente est que votre 'getline' doit être dans une boucle. –

Répondre

0

Juste un début

#!/bin/bash 

awk 'BEGIN{FS="|"} 
FNR==NR{ nar[$1]=$2; next } 
END{ 
    for(i=2;i<ARGC;i++){ 
    xmlfile=ARGV[i] 
    split(xmlfile,fname,".") 
    print "Doing file: "xmlfile 
    print "---------------------------------" 
    while((getline line < xmlfile) > 0) { 
     if (line ~ /<narrative>/){ 
      line="<narrative>"nar[fname[1]]"</narrative>" 
     } 
     print line 
    } 
    } 
}' rtxt 42.xml 71.xml 
+0

Modifié le. Regarde. – rup