Eu tenho um arquivo parecido com este:
[2024-01-20 15:23:00] hello world
[2024-01-20 15:42:00] bye
[2024-01-20 15:43:00] foo bar
...
A data neste arquivo está em UTC+1 e quero converter para UTC
Tentei usar sed
com grupos de captura:
cat file | sed -E "s/(([0-9]+-[0-9]+-[0-9]+)? ?([0-9]+:[0-9]+:[0-9]+))/$(date -d "\1 UTC+1" +%H:%M:%S -u)/g"
mas estou recebendo:
date: invalid date ‘\\1 UTC+1’
Eu tentei seguir as substituições de \1
:
"\1"
'\1'
\\1
"\\1"
'\\1'
Nenhuma das opções acima funcionou.
Para testes, estou usando esta linha:
echo '19:40:14 foo bar' | sed -E "s/([0-9:]+)/$(date -d "\1 UTC+1" -u +%R)/g"
Resultado desejado: 19:40:14
-> 18:40:14
caso o fuso horário seja UTC+1
Estou aberto a usar outra coisa em vez desed
Usando GNU sed como seu
e
modificadorA
$(...)
abordagem nunca funcionará porque tais expansões são processadas pelo shell, e 'sed' não faz parte do shell, o que significa que todas as$
substituições na linha de comando acontecem antes mesmo de 'sed' ser executado - e elas só são feitas uma vez para todo o comando.(Ele não vai e volta entre 'sed' e o shell a ser reexpandido para cada correspondência de regex, nem tudo acontece "simultaneamente"; há uma certa ordem de operações.)
Para que isso funcione, o ajuste da data precisa ser feito dentro do mesmo programa. 'sed' não possui tais capacidades; AWK pode, embora alguma outra linguagem provavelmente seja mais conveniente.
Escreva um script em Python, Ruby, PHP, Perl que leia cada linha do STDIN e faça uma substituição de regex – todas essas linguagens têm uma maneira de usar uma 'função de retorno de chamada' como substituição de regex (por exemplo, em Python você pode literalmente passar uma função como parâmetro, em Perl você usa a
/e
opção regex).(Ou execute tudo , incluindo o regex no Bash, usando um
while read
loop e[[ a =~ b ]]
o operador de correspondência de regex do Bash.)