Nous pouvons utiliser l'un sedou l'autre awkpour 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 awkcode 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 sedsolution):
$ 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)