para bucle sobre líneas de entrada

para bucle sobre líneas de entrada

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 IFSen nada mientras dure el readcomando. 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 readbucle.

$ 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.

información relacionada