Se a saída do comando curl
for estável e consistente, poderemos criar um conjunto muito básico de comandos sed
com base no número de linha
por exemplo
2s! /.*!!
pegaria a linha 2 e excluiria tudo depois do /
e, assim, converteria
Aug 09, 2016 - 10:56 AM EDT / 2016.08.09 1456 UTC
em
Aug 09, 2016 - 10:56 AM EDT
Podemos adicionar \n
à substituição.
Em seguida, use a opção -n
para sed
para torná-la apenas as linhas de impressão que têm p
na substituição
Então acabamos com:
sed -n -e '2s! /.*!\n!p' \
-e '4s/Sky \(.*\)/\n/p' \
-e '5s/.*: \([0-9]* F\).*/\n/p' \
-e '8s/Relative //p'
Finalmente, precisamos remover os caracteres de avanço de linha com tr -d '2'
e, para simplificar, vamos colocar tudo em uma linha:
sed -n -e '2s! /.*!\n!p' -e '4s/Sky \(.*\)/\n/p' -e '5s/.*: \([0-9]* F\).*/\n/p' -e '8s/Relative //p' | tr -d '2'
Esta solução é frágil se a entrada puder variar, mas é muito fácil de entender.
Então, vamos olhar para algo um pouco menos frágil e tentar detectar as linhas baseadas no padrão.
awk '/UTC$/ { gsub(/ \/.*$/,""); d=$0 }
/^Sky conditions:/ {gsub(/^Sky /,""); s=$0 }
/^Temperature: / { t=$2 }
/Relative Humidity: / { h=$3 }
END { print d"\n"s"\n"t" F\nHumidity: "h }
'
Aqui, a ordem das linhas não é tão importante, desde que elas correspondam ao padrão; as datas devem terminar em UTC, etc etc
EDIT com base na pergunta atualizada.
Colocar citações dentro de awk
às vezes pode ser doloroso, então podemos trapacear e simplesmente atribuí-la a uma variável antes da mão ( q
neste caso) e usá-la diretamente na declaração final print
awk -vq=\' '/UTC$/ { gsub(/ \/.*$/,""); d=$0 }
/^Sky conditions:/ {gsub(/^Sky /,""); s=$0 }
/^Temperature: / { t=$2 }
/Relative Humidity: / { h=$3 }
END { print q""d"\n"s"\n"t" F\nHumidity: "h""q }
'