2010-02-14 10 views
4

J'ai besoin d'un moyen de remplacer les codes HTML ASCII comme ! avec leur caractère correct dans bash.Remplacer les codes ascii HTML via un script bash?

Existe-t-il un utilitaire sur lequel je pourrais exécuter ma sortie, ou quelque chose du genre?

+0

Je suppose que cela dépend de la complexité des fichiers et de la fréquence à laquelle vous devez le faire; à petite échelle, je voudrais simplement ouvrir le fichier avec un navigateur et le copier/coller. –

+0

Avez-vous besoin de préserver le code HTML? –

+0

Carl: Je ne peux pas l'ouvrir dans un navigateur car il s'agit d'un script d'arrière-plan conçu pour être utilisé par GeekTool. Dennis: Non, je supprime simplement l'élément de description d'un flux RSS. – vilhalmer

Répondre

6
 
$ echo '!' | recode html/.. 
! 
$ echo '<∞>' | recode html/.. 
<∞> 
+0

ephémient, c'est génial! Le seul problème est qu'il n'est pas inclus avec OS X, donc je vais devoir trouver un moyen de le distribuer. – vilhalmer

+2

Une alternative est de passer par un navigateur Web - tel que 'echo '!' | w3m -dump -T text/html' – grawity

+0

@ SphereCat1 http://recode.darwinports.com/ http://pdb.finkproject.org/pdb/package.php/recode N'oubliez pas de distribuer GNU recode compatible avec ses licence, GPL. @grawity Clever, mais je ne pense pas que OS X soit avec w3m ou lynx non plus ;-) – ephemient

1

Je ne sais pas d'un moyen facile, voici ce que je suppose que je ferais ...

Vous pourriez être en mesure de scripter un navigateur en lecture du fichier et puis l'enregistrer sous forme de texte. Si lynx prend en charge les entités de caractères html, il peut être utile de regarder dans. Si cela ne fonctionne pas ...

La solution générale à quelque chose comme ceci est faite avec sed. Pour cela, vous avez besoin d'une modification "d'ordre supérieur", car vous commencez par an entity table, puis vous modifiez cette table dans un script d'édition avec une procédure en plusieurs étapes. Quelque chose comme:

. . . 
s/&amp;Dagger;/&Dagger;/g<br /> 
s/&amp;#8221;/&#8221;/g<br /> 
. . . 

Ensuite, encapsulent cela comme html, lu dans un navigateur, et enregistrez-le sous forme de texte dans le jeu de caractères que vous ciblez. Si vous l'obtenez pour produire des lignes comme:

s/&lt;/</g 

alors vous gagnez. Un script bash qui appelle sed ou ex peut être piloté par les commandes de remplacement du fichier.

+0

Très bien, c'est à peu près ce que je fais déjà, en ajoutant manuellement chacun d'eux au script. Je ne savais pas que je pourrais lancer sed avec un fichier de script, cependant, c'est un peu utile d'infos! Merci! – vilhalmer

+0

Si vous utilisez cette solution, veillez à mettre 's/& \ | & # 38 \ | &/\ &/g' à la fin du script; sinon, si c'est avant une autre entrée (par exemple 's/! /!/ g'), alors '& # 33;' serait incorrectement traduit en '!' au lieu de ''. – ephemient

2

Voici ma solution avec la boîte à outils Linux standard.

$ foo="This is a line feed&#010;And e acute:&#233; with a grinning face &#128512;." 
$ echo "$foo" 
This is a line feed&#010;And e acute:&#233; with a grinning face &#128512;. 
$ eval "$(printf '%s' "$foo" | sed 's/^/printf "/;s/&#0*\([0-9]*\);/\$([ \1 -lt 128 ] \&\& printf "\\\\$(printf \"%.3o\\201\" \1)" || \$(which printf) \\\\U\$(printf \"%.8x\" \1))/g;s/$/\\n"/')" | sed "s/$(printf '\201')//g" 
This is a line feed 
And e acute:é with a grinning face . 

Vous voyez que cela fonctionne pour toutes sortes d'évasions, même saut de ligne, aiguë e (é) qui est un UTF-8 2 octets et même les nouvelles émoticônes qui sont dans le plan étendu (4 octets unicode).

Cette commande fonctionne AUSSI avec le tiret qui est un shell réduit (shell par défaut sur Ubuntu) et est également compatible avec bash et des coquilles comme les cendres utilisées par le Synology.

Si cela ne vous dérange pas de rester avec bash et de laisser tomber la compatibilité, vous pouvez faire est beaucoup plus simple.

Bits utilisés doivent être dans une boîte de Linux décent (ou OS X?) - qui - printf (GNU et builtin) - GNU sed - eval (SHELL)

La bash seule version don pas besoin de quoi ni le printf GNU.