Você pode usar o GNU date
para converter a hora em seu fuso horário local.
awk '/^Date:.*UTC/ {cmd="date -Rd \"" substr($0,6) "\""; cmd | getline new; close(cmd); $0="Date: " new} 1' file
text text
more text
Date: Fri, 01 Jan 2016 01:53:51 +0200
more text
some more
Se você tiver o GNU awk, você pode alterar todos os arquivos no diretório atual usando:
gawk -i inplace '/^Date:.*UTC/ {cmd="date -Rd \"" substr($0,6) "\""; cmd | getline new; close(cmd); $0="Date: " new} 1' *
Sem o GNU awk, use:
for f in *
do
awk '/^Date:.*UTC/ {cmd="date -Rd \"" substr($0,6) "\""; cmd | getline new; close(cmd); $0="Date: " new} 1' "$f" >tmp && mv tmp "$f"
done
Como funciona
-
-i inplace
Isto diz ao GNU awk para alterar os arquivos no lugar. Isso requer um moderno GNU awk. Se você usar o awk de Mike, use o loop do bash como mostrado acima.
-
/^Date:.*UTC/ {cmd="date -Rd \"" substr($0,6) "\""; cmd | getline new; close(cmd); $0="Date: " new}
Isso seleciona as linhas que começam com
Date:
e contêmUTC
na mesma linha. Para essas linhas, o comandodate -Rd
é executado na parte da linha que contém a data. O resultado é armazenado na variávelnew
. Então, a linha atual, denotada por$0
no awk, é substituída por uma com a nova data. -
1
Esta é uma abreviada enigmática do awk para imprimir a linha.
Versão GNU de várias linhas
Se você preferir que seus scripts sejam distribuídos em várias linhas:
gawk -i inplace '
/^Date:.*UTC/ {
cmd="date -Rd \"" substr($0,6) "\""; cmd | getline new
close(cmd)
$0="Date: " new
}
1
' file
Alguns refinamentos (versão não-GNU)
-
O código acima procura linhas que começam com
Date:
e que também contêm as letrasUTC
. Isto parece-me bom o suficiente. A pergunta, no entanto, é mais específica para as linhas que iniciamDate:
e terminam com+0000 (UTC)
. -
A pergunta também pede para eliminar o
+0200
à direita das linhas de data não UTC.
Adicionando esses dois refinamentos, o código se torna:
for f in *
do
awk '/Date: .* [+]0200$/{sub(/ [+]0200$/,"")} /^Date: .* [+]0000 [(]UTC[)]$/ {cmd="date -Rd \"" substr($0,6) "\""; cmd | getline new; close(cmd); $0="Date: " new} 1' "$f" >tmp && mv tmp "$f"
done
Esse código é mais preciso, mas também mais perspicaz. Por exemplo, esse código insiste em que uma linha termine com +0000 (UTC)
antes de alterá-la. Consequentemente, as linhas com espaços em branco à direita, que podem ser invisíveis em seu editor, não serão alteradas. Se isso é bom ou não é algo para você decidir.