Podemos usar cualquiera de sed
o awk
para resolver completamente el problema.
Con sed
:
$ sed 's/^.\./0&/' file.txt
Cuando &
ocurre en la parte de reemplazo del comando de sustitución ( s
), se expandirá a la parte de la línea de entrada que coincida con la parte del patrón del comando.
La expresión regular ^.\.
significa "hacer coincidir todas las líneas que comienzan con ( ^
) un carácter arbitrario ( .
) seguido de un punto literal ( \.
) ".
Si la línea es 1.02.2017 23:40:00
, el patrón coincidirá y 1.
sería reemplazado por 01.
al comienzo de la línea.
Con awk
:
Sobre la base del awk
código parcial en la pregunta ...
Esto, como se indicó, imprimirá el segundo carácter de cada línea de entrada:
$ awk '{ print substr($0, 2, 1) }' file.txt
Podemos usar el hecho de que substr($0, 2, 1)
devuelve el segundo carácter y usarlo como condición:
$ awk 'substr($0, 2, 1) == "." { ... }' file.txt
Lo que entra { ... }
es un código que precede $0
, que es el contenido de la línea actual, con un cero si la condición anterior es verdadera:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt
Entonces solo necesitamos asegurarnos de que todas las líneas estén impresas:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt
La condición substr($0, 2, 1) == "."
, por supuesto, también puede cambiarse a una expresión regular (usamos exactamente la misma expresión que usamos en la sed
solución):
$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt
Algunas personas que piensan que "más corto siempre es mejor" escribirían eso como
$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt
(y probablemente también eliminar la mayoría de espacios: awk '/^.\./{$0="0"$0}1' file.txt
)