Eu só estava pensando sobre isso e, por causa da maneira como os anos bissextos alternam todos os anos pares, o seguinte é verdadeiro:
([13579][26]|[02468][048]) == leap year
Basicamente, os anos bissextos ocorrem nos anos 2 e 6 nas décadas ímpares, mas nos anos 4 e 8 nas décadas pares e na virada de todas as outras décadas.
E assim você pode fazer:
sed -e' /[02468] * 2 * 28 /!b'\
-e'h;/[13579][26] * 2 / G' \
-e' /[02468][048] * 2 /G' \
-e' /\n/s/ 28 / 29 /2' \
-eP\;D <in >out
... que encontraria, em dobro, depois modificaria todas as linhas de 28 de fevereiro na entrada apenas para anos bissextos, independentemente do ponto inicial de qualquer loop de alternância.
Esse foi meu primeiro instinto:
sed -e'/\([02648] * 2 * 2\)8 /!b' \
-e:n -e'n;//!bn' -e'p;s// /' <in
... o que foi apenas uma ligeira adaptação à minha resposta à sua outra pergunta , mas que só vai trabalho para cada série em que o primeiro ano sequer encontrado não é um ano bissexto porque funciona alternadamente.
Eu testei os dois sed
s em relação ao meu arquivo de teste da sua outra pergunta . O infil já teve anos bissextos, é claro, e o código que usei para gerá-lo também está na resposta, mas ambos funcionaram para uma série que começou em 1970, embora o primeiro não fosse quebrado de qualquer maneira:
1970 2 27 58
1970 2 28 59
1970 3 1 60
1972 2 27 58
1972 2 28 59
1972 2 29 59
1972 2 29 60
1972 3 1 61
1974 2 27 58
1974 2 28 59
1974 3 1 60
1976 2 27 58
1976 2 28 59
1976 2 29 59
1976 2 29 60
1976 3 1 61
1978 2 27 58
1978 2 28 59
1978 3 1 60
1980 2 27 58
1980 2 28 59
1980 2 29 59
1980 2 29 60
1980 3 1 61