for loop sobre linhas de entrada

for loop sobre linhas de entrada

Eu tenho um arquivo com muitas linhas como esta

/item/pubDate=Dom, 23 de fevereiro de 2014 00:55:04 +010

Se eu executar isso

echo "/item/pubDate=Sun, 23 Feb 2014 00:55:04 +010" | grep -Po "(?<=\=).*"

Sun, 23 Feb 2014 00:55:04 +010

Recebo a data correta (tudo em uma linha). Agora quero tentar isso com várias datas em um arquivo xml. Eu uso isso e está tudo bem.

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

Mas agora quero usar a data em um programa bash e recebo esta saída

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

Quero a saída da data em uma linha (na variável fecha) como o primeiro e o segundo exemplos mas não sei como fazer.

Responder1

Em vez disso, faça desta forma:

while IFS= read -r fecha; do
    echo $fecha
done < <(xml2 < podcast | egrep "pubDate" | grep -Po "(?<=\=).*")

O Bash separará "palavras" para percorrer por caracteres no Separador de Campo Interno ( $IFS). Você pode desativar temporariamente esse comportamento definindo IFSnada durante o readcomando. O padrão acima sempre fará um loop linha por linha.

<(command)faz com que a saída de um comando pareça um arquivo real, que então redirecionamos para nosso readloop.

$ 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

Responder2

xml2 < date_list | egrep "pubDate" | grep -Po "(?<=\=).*" \
| while read L
  do
    echo $L
  done

lerquebra linhas e não divide palavras, a menos que seja solicitado. :-)

No entanto, lidar com XML com expressões regulares é trazer uma faca para um tiroteio. É muito fácil construir um XML válido que o pipeline acima irá perder ou capturar incorretamente.

Se você lida com muito XML, você realmente quer se sentir confortável com um analisador SAX.

informação relacionada