Podemos usar sed
ou awk
resolver completamente o problema.
Com sed
:
$ sed 's/^.\./0&/' file.txt
Quando &
ocorrer na parte de substituição do comando de substituição ( s
), ela será expandida para a parte da linha de entrada que corresponde à parte padrão do comando.
A expressão regular ^.\.
significa " corresponder 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
:
Com base no awk
código parcial na pergunta ...
Isso, como indicado, imprimirá o segundo caractere de cada linha de entrada:
$ awk '{ print substr($0, 2, 1) }' file.txt
Podemos usar o fato de substr($0, 2, 1)
retornar o segundo caractere e usá-lo como condição:
$ awk 'substr($0, 2, 1) == "." { ... }' file.txt
O que entra { ... }
é o código que precede $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, precisamos apenas garantir que todas as linhas sejam impressas:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt
substr($0, 2, 1) == "."
Obviamente, a condição também pode ser alterada para uma expressão regular (usamos exatamente a mesma expressão que usamos na sed
solução):
$ 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 remover a maioria dos espaços: awk '/^.\./{$0="0"$0}1' file.txt
)