Tengo un archivo con muchas líneas como esta.
/item/pubDate=domingo, 23 de febrero de 2014 00:55:04 +010
Si ejecuto esto
echo "/item/pubDate=Sun, 23 Feb 2014 00:55:04 +010" | grep -Po "(?<=\=).*"
Sun, 23 Feb 2014 00:55:04 +010
Obtengo la fecha correcta (toda en una línea). Ahora quiero probar esto con muchas fechas en un archivo xml. Yo uso esto y está bien.
xml2 < date_list | egrep "pubDate" | grep -Po "(?<=\=).*"
Fri, 22 Jan 2016 17:56:29 +0100
Sun, 13 Dec 2015 18:33:02 +0100
Wed, 18 Nov 2015 15:27:43 +0100
...
Pero ahora quiero usar la fecha en un programa bash y obtengo este resultado.
for fecha in $(xml2 < podcast | egrep "pubDate" | grep -Po "(?<=\=).*"); do echo $fecha; done
Fri,
22
Jan
2016
17:56:29
+0100
Sun,
13
Dec
2015
18:33:02
+0100
Wed,
18
Nov
2015
15:27:43
+0100
Quiero que la fecha salga en una línea (en la variable fecha) como el primer y segundo ejemplo pero no sé cómo hacerlo.
Respuesta1
Hazlo de esta manera en su lugar:
while IFS= read -r fecha; do
echo $fecha
done < <(xml2 < podcast | egrep "pubDate" | grep -Po "(?<=\=).*")
Bash separará las "palabras" para recorrerlas mediante caracteres en el separador de campo interno ( $IFS
). Puede desactivar temporalmente este comportamiento configurándolo IFS
en nada mientras dure el read
comando. El patrón anterior siempre se repetirá línea por línea.
<(command)
hace que la salida de un comando parezca un archivo real, que luego redirigimos a nuestro read
bucle.
$ while IFS= read -r line; do echo $line; done < <(cat ./test.input)
Fri, 22 Jan 2016 17:56:29 +0100
Sun, 13 Dec 2015 18:33:02 +0100
Wed, 18 Nov 2015 15:27:43 +0100
Respuesta2
xml2 < date_list | egrep "pubDate" | grep -Po "(?<=\=).*" \
| while read L
do
echo $L
done
leerrompe líneas y no divide palabras a menos que se le solicite. :-)
Sin embargo, abordar XML con expresiones regulares es llevar un cuchillo a un tiroteo. Es muy fácil construir XML válido que la canalización anterior omitirá o capturará incorrectamente.
Si trabaja con mucho XML, realmente querrá sentirse cómodo con un analizador SAX.