Podemos usar sed
ou awk
para resolver completamente o problema.
com sed
:
$ sed 's/^.\./0&/' file.txt
Quando &
ocorre na parte de substituição do comando de substituição ( s
), ele será expandido para a parte da linha de entrada que corresponde à parte do padrão do comando.
A expressão regular ^.\.
significa " corresponde a todas as linhas que começam com ( ^
) um caractere arbitrário ( .
) seguido por um ponto literal ( \.
) ".
Se a linha for 1.02.2017 23:40:00
, o padrão corresponderá e 1.
será substituído por 01.
no início da linha.
com awk
:
Criando o código parcial awk
na pergunta ...
Isto, como dito, imprime o segundo caractere de cada linha de entrada:
$ awk '{ print substr($0, 2, 1) }' file.txt
Podemos usar o fato de que substr($0, 2, 1)
retorna o segundo caractere e usa isso como condição:
$ awk 'substr($0, 2, 1) == "." { ... }' file.txt
O que entra em { ... }
é o código que prefixa $0
, que é o conteúdo da linha atual, com um zero se a condição anterior for verdadeira:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt
Então só precisamos ter certeza de que todas as linhas são impressas:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt
A condição substr($0, 2, 1) == "."
pode, é claro, ser alterada para uma expressão regular também (usamos exatamente a mesma expressão que usamos na sed
solution):
$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt
Algumas pessoas que pensam que "menor é sempre melhor" escreveriam isso como
$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt
(e provavelmente também remove a maioria dos espaços: awk '/^.\./{$0="0"$0}1' file.txt
)