No estoy muy familiarizado con expresiones regulares, sed, etc. y me da un poco de pereza entenderlo en este momento, entonces, ¿cómo extraigo esta línea?
<yweather:astronomy sunrise="6:50 am" sunset="7:06 pm"/>
Avíseme si se necesita más estructura xml.
Respuesta1
Dado que los datos de entrada (su archivo XML) están estructurados, es mejor utilizar una consulta sobre esos datos estructurados, en lugar de tratarlos como texto sin formato y alterar expresiones regulares.
Podemos usar xmllint --xpath
para evaluar una expresión XPath en su entrada xml:
$ xmllint --xpath 'string(rss/channel/*[local-name()="astronomy"]/@sunrise)' weather.xml
6:48 am
- esto es un poco complicado, ya que tenemos que lidiar con los diferentes espacios de nombres en ese archivo, pero funciona de todos modos.
Para obtener más información sobre XPath, la especificación se encuentra enhttp://www.w3.org/TR/xpath/
Respuesta2
No usas expresiones regulares o sed. Utiliza un analizador XML y un lenguaje de consulta XML (XPath o XQuery). Y me temo que los detalles dependen del contexto: por ejemplo, "yweather" es un nombre corto (prefijo) para un espacio de nombres, y necesitas saber qué espacio de nombres representa.
Respuesta3
La respuesta correcta, como dice Michael Kay, es utilizar una herramienta específica de XML.
Para una solución rápida y sucia, aquí hay un enfoque sed. Comencemos con este archivo:
$ cat file
<yweather:astronomy sunrise="6:50 am" sunset="7:06 pm"/>
Para extraer la hora del atardecer:
$ sed -rn 's/.*sunset="([^"]*)".*/\1/p' file
7:06 pm
Para entender la expresión regular, dividámosla en tres partes:
.*
Partidos desde el inicio de la alineación hasta la segunda parte.Esta parte,
sunset="([^"]*)"
coincide con los caracteressunset="
, seguida de cualquier número de caracteres excepto"
, seguido del cierre"
. La expresión[^"]
significa cualquier carácter excepto"
y[^"]*
significa cualquier número de dichos caracteres. El paréntesis(...)
, captura los caracteres dentro del"..."
grupo 1 de sed al que luego nos referimos como\1
..*
coincide con todos los caracteres después de la expresión del atardecer.
Respuesta4
daré la misma respuesta deJeremy Kerrpero dándole un xml
ejemplo.
Tenemos un archivo xml llamado config.xml
en nuestra carpeta raíz y queremos leer un atributo o una propiedad de una etiqueta, sea la widget
etiqueta.
config.xml
:
<?xml version='1.0' encoding='utf-8'?>
<widget android-versionCode="16" id="co.app.world" ios-CFBundleVersion="0.1.3" version="3.0.5" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>AppName</name>
<description>Description.</description>
<author email="hi@ionicframework" href="http://ionicframework.com/">Ionic Framework Team</author>
</widget>
Queremos obtener el android-versionCode
valor de la propiedad, escribimos esto en la terminal:
xmllint --xpath "string(//*[local-name()='widget']/@android-versionCode)" config.xml
Producción:
16
Explicación: usamos /*[local-name()='widget']
para mapear la widget
etiqueta y luego @android-versionCode
leer la propiedad de esta.