para loop sobre linhas de entrada

6

Eu tenho um arquivo com muitas linhas como esta

/ item / pubDate = dom, 23 fev. 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

Eu recebo a data correta (tudo em uma linha). Agora eu quero tentar isso com muitas datas em um arquivo xml. Eu uso isso e 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 eu quero usar a data em um programa bash e recebo essa 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

Eu quero a saída de data em uma linha (na variável fecha) como o primeiro e segundo exemplos, mas eu não sei como fazê-lo.

    
por estonolose 16.02.2016 / 22:36

2 respostas

7

Faça assim:

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

O Bash separará as "palavras" para percorrer os caracteres no Separador de campo interno ( $IFS ). Você pode desativar temporariamente esse comportamento configurando IFS para nada durante o comando read . O padrão acima irá sempre repetir linha por linha.

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

$ 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
    
por 16.02.2016 / 23:11
2
xml2 < date_list | egrep "pubDate" | grep -Po "(?<=\=).*" \
| while read L
  do
    echo $L
  done

quebra 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 falhe ou capture incorretamente.

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

    
por 17.02.2016 / 01:40