2010-05-11 11 views
1

J'ai un fichier XML avec beaucoup d'attributs de balises vides. Par exemple:sed: rechercher et remplacer la chaîne par le numéro de ligne

<mytag id=""> 
    <ontent>aaa</content> 
</mytag> 
<mytag id=""> 
    <ontent>bbb</content> 
</mytag> 
<mytag id=""> 
    <ontent>ccc</content> 
</mytag> 

Maintenant je veux remplacer id = "" avec par exemple. J'ai essayé de le faire avec sed, mais je n'ai pas obtenu de résultat.

J'espère que quelqu'un ici peut me aider :-)

Répondre

2

Si vous voulez remplacer vide id="" avec id="l"l est le numéro de la ligne où le mytag se trouve que vous pouvez faire:

Edit:

Sur la base des commentaires:

perl -pe '$i++; s{id=""}{id="$i"}' < file.xml 
+1

Ceci fonctionnera à condition que l'entrée XML ne soit pas libre mais exactement comme publiée. Nit-pick: vous pouvez supprimer 'print' si vous utilisez' perl -pe' à la place. – msw

+1

Si je ne me trompe pas, cela serait mieux fait avec perl -ne/ici soit code/ zellio

+0

Je creuse les accolades sur l'opérateur 's'. J'oublie toujours que tu peux le faire. – msw

0

Vous pouvez essayer avec awk à la place. Le numéro de ligne est stocké dans la variable NR.

1

Si vous pouvez garantir que votre XML - qui peut être sous forme libre - est sous la forme exacte que vous avez écrite, awk ou perl pourrait faire le travail beaucoup plus simplement n sed. Unicornaddict avait quelque chose qui fonctionne, mais je serais un peu plus prudent dans la ligne de substitution:

perl -pe '$i++; s{id=""}{id="$i"} if /^<mytag id="">/' filename.xml 

Si vous ne pouvez pas garantir que le XML ne forme libre, vous auriez vraiment dû analyser avec un analyseur XML approprié. XML généralisé ne peut pas être analysé avec des expressions régulières.