Nous pouvons utiliser l'un sed
ou l'autre awk
pour résoudre complètement le problème.
Avec sed
:
$ sed 's/^.\./0&/' file.txt
Lorsque &
survient dans la partie de remplacement de la commande de substitution ( s
), il sera étendu à la partie de la ligne d'entrée qui correspond à la partie de modèle de la commande.
L'expression régulière ^.\.
signifie " correspondre à toutes les lignes commençant par ( ^
) un caractère arbitraire ( .
) suivi d'un point littéral ( \.
) ".
Si la ligne est 1.02.2017 23:40:00
, le motif correspondra et 1.
sera remplacé par 01.
au début de la ligne.
Avec awk
:
S'appuyant sur le awk
code partiel de la question ...
Comme indiqué, cela imprimera le deuxième caractère de chaque ligne d'entrée:
$ awk '{ print substr($0, 2, 1) }' file.txt
Nous pouvons utiliser le fait que substr($0, 2, 1)
renvoie le deuxième caractère et l'utiliser comme condition:
$ awk 'substr($0, 2, 1) == "." { ... }' file.txt
Ce qui se passe { ... }
est un code qui précède $0
, qui est le contenu de la ligne actuelle, avec un zéro si la condition précédente est vraie:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt
Ensuite, nous devons juste nous assurer que toutes les lignes sont imprimées:
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt
La condition substr($0, 2, 1) == "."
peut bien sûr également être changée en une expression régulière (nous utilisons exactement la même expression que celle utilisée dans la sed
solution):
$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt
Certaines personnes qui pensent que "plus court est toujours mieux" écriraient cela comme
$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt
(et probablement aussi supprimer la plupart des espaces: awk '/^.\./{$0="0"$0}1' file.txt
)