2011-03-21 20 views
17

estoy grepping un archivo XML, lo que me da salida como esta:Cómo eliminar etiquetas XML de la línea de comandos de Unix?

<tag>data</tag> 
<tag>more data</tag> 
... 

Nota, este es un archivo plano, no un árbol XML. Quiero eliminar las etiquetas XML y simplemente mostrar los datos en el medio. Estoy haciendo todo esto desde la línea de comandos y me preguntaba si hay una manera mejor que las tuberías en awk dos veces ...

cat file.xml | awk -F'>' '{print $2}' | awk -F'<' '{print $1}' 

Idealmente, me gustaría hacer esto en un comando

+0

* "Estoy grepping un archivo XML" * - * "se trata de un archivo plano, no un árbol XML" * - Ahora, ¿el archivo está bien formado XML o no? – Tomalak

+0

Quizás debería haber sido un poco más claro: es un archivo XML bien formado, pero una vez que lo he canalizado a través de grep ya no es una estructura de árbol XML, es esencialmente un archivo plano. – Tarski

+0

Ahh, ahora tiene sentido para mí.De todos modos, he aceptado porque la versión * clean * sería pasar este archivo XML a través de XSLT, en lugar de a través de grep/sed. Escribiría una respuesta XSLT pero parece que has elegido tu veneno. :-) – Tomalak

Respuesta

4

Utilizando awk:

awk '{gsub(/<[^>]*>/,"")};1' file.xml 
+0

Al probar la página html, los resultados parecen idénticos a sed (arriba). ¡Gracias por publicar el método awk! – p1nesap

1

seguirlo:

grep -Po '<.*?>\K.*?(?=<.*?>)' inputfile 

Explicación:

Utilizando Perl expresiones Compatible Regular (-P) y la salida sólo los partidos especificados (-o):

  • <.*?> - Partido no codicioso de cualquier carácter dentro de paréntesis angulares
  • \K - No incluya el partido anterior en la salida (RESET START partido - similar a la mirada positiva detrás, pero funciona con longitud variable coincide)
  • .*? - no codicioso partido parando en el próximo partido (esta parte será de salida)
  • (?=<.*?>) - partido no codicioso de los personajes dentro de paréntesis angulares, y no incluyen el partido en la salida (Look-positivo adelante - funciona con coincidencias de longitud variable)
+0

Funcionará solo en Linux, ya que en OSX se ha eliminado el indicador '-P'. – kenorb

+0

@kenorb: tenga en cuenta que las utilidades de GNU están disponibles para OS X. Utilizando [Homebrew] (http://brew.sh/), por ejemplo. –

1

Utilice la herramienta de línea de comandos html2text, que convierte html en texto sin formato.

Alternativamente, usted puede tratar ex-way:

ex -s +'%s/<[^>].\{-}>//ge' +%p +q! file.txt 

o:

cat file.txt | ex -s +'%s/<[^>].\{-}>//ge' +%p +q! /dev/stdin 
0

Sé que esto no es un "concurso perlgolf", pero solía utilizar este truco.

Conjunto separador de registros de < o >, a continuación, imprimir sólo las líneas impares:

awk -vRS='<|>' NR%2 file.xml 
Cuestiones relacionadas