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 IFS
nada durante o read
comando. 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 read
loop.
$ 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.