È possibile utilizzare sed
o awk
per risolvere completamente il problema.
Con sed
:
$ sed 's/^.\./0&/' file.txt
Quando si &
verifica nella parte sostitutiva del comando di sostituzione ( s
), verrà espansa nella parte della riga di input che corrisponde alla parte del modello del comando.
L'espressione regolare ^.\.
significa "trova tutte le righe che iniziano con ( ^
) un carattere arbitrario ( .
) seguito da un punto letterale ( \.
) ".
Se la linea è 1.02.2017 23:40:00
, il modello corrisponderà e 1.
verrà sostituito da 01.
all'inizio della linea.
Con awk
:
Basandosi sul awk
codice parziale nella domanda ...
Questo, come detto, stampa il secondo carattere di ogni riga di input:
$ awk '{ print substr($0, 2, 1) }' file.txt
Possiamo usare il fatto che substr($0, 2, 1)
restituisce il secondo carattere e usarlo come condizione:
$ awk 'substr($0, 2, 1) == "." { ... }' file.txt
Ciò che accade { ... }
è il codice che antepone $0
, che è il contenuto della riga corrente, con uno zero se la condizione precedente è vera:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt
Quindi dobbiamo solo assicurarci che tutte le linee siano stampate:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt
substr($0, 2, 1) == "."
Naturalmente la condizione può anche essere cambiata in un'espressione regolare (usiamo esattamente la stessa espressione che abbiamo usato nella sed
soluzione):
$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt
Alcune persone che pensano che "più corto è sempre meglio" lo scriverebbero come
$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt
(e probabilmente anche rimuovere la maggior parte degli spazi: awk '/^.\./{$0="0"$0}1' file.txt
)