usando o comando sed para substituir as primeiras 2 ocorrências de “:” dentro de uma string

0

Estou tentando comparar duas datas no formato YYYY:MM:DD HH:MM:SS usando o comando date (bash). Meu problema é que o comando date usa apenas o formato de data (até onde eu sei) YYYY-MM-DD HH:MM:SS . Eu estava tentando usar sed com expressões regulares para substituir as duas primeiras ocorrências de : com - , mas não consegui fazer com que funcionasse. Estou apenas começando em 2018.

date1="2018:01:16 12:25:35"
echo $date1 | sed 's/\([0-9]*\).*//'

Aceito todas as sugestões possíveis e agradeço a você.

    
por Fxbaez 18.01.2018 / 01:38

5 respostas

1

[<> Respondendo a pergunta conforme solicitado - embora provavelmente não seja a melhor maneira de abordar seu problema real de comparação de datas ]

Uma maneira seria substituir os dois pontos por vez usando um loop, quebrando o loop quando o resultado contiver dois hífens:

echo '2018:01:16 12:25:35' | sed ':a; /^[^-]*-[^-]*-/ b; s/:/-/; ta'
2018-01-16 12:25:35

Alternativamente, se você tem o GNU sed, você poderia substituir all os dois-pontos com hífens, então substituir o terceiro hífen para a frente com os dois-pontos novamente:

echo '2018:01:16 12:25:35' | sed 's/:/-/g; s/-/:/3g'
2018-01-16 12:25:35
    
por 18.01.2018 / 02:36
6

Basta fazer uma substituição simples duas vezes:

sed 's/:/-/;s/:/-/'
    
por 18.01.2018 / 02:52
1

Considere o uso do comando data da GNU diretamente:

date1=$(date +”%Y-%m-%d %H-%M-%S”)
    
por 18.01.2018 / 01:48
1
| sed 's/\([0-9]*\).*//'

Isso salva a primeira string de dígitos, come tudo depois disso com o .* e depois coloca esses dígitos de volta, então, de fato, qualquer coisa depois que o 2018 desaparecer.

Você precisaria capturar as duas primeiras sequências de dígitos, além dos separadores para substituí-los, e não corresponder ao restante da linha:

$ echo "2018:01:16 12:25:35" | sed 's/\(....\):\(..\):/--/'
2018-01-16 12:25:35
    
por 18.01.2018 / 11:16
1

Eu usei abaixo de 2 métodos para alcançar o resultado mencionado

method1 usando a função awk gsub

echo $date1| awk '{gsub(":","-",$1);print $0}'

saída 2018-01-16 12:25:35

Method2 usando sed

echo $date1 |sed "s/:/-/"| sed "s/:/-/"

saída 2018-01-16 12:25:35

Method3 usando perl

echo $date1| perl -pne "s/:/-/"| perl -pne "s/:/-/"

saída 2018-01-16 12:25:35

    
por 18.01.2018 / 17:46