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
)
sed 's/^.\./0&/' file.txt
. Je pense que vous devriez mettre cela au début de cette réponse. Pourtant, +1.Avec sed:
Le motif
/^.\./
recherche n'importe quel caractère et un point littéral au début de la ligne^
, et si cela correspond,s
remplacez ce début de ligne par un zéro, en ajoutant effectivement le zéro au début.L'expressoin sed
s/.\{0\}/0/
est quelque peu étrange, elle correspond à zéro ou plusieurs copies de quoi que ce soit et remplace par un zéro. Le motif correspondra bien sûr à chaque position de la chaîne, mais comme ils///
ne remplace que la première correspondance, il fonctionne comme vous le souhaitiez. Une façon pittoresque de le faire, cependant.Ou avec awk, une expression rationnelle similaire fonctionnerait pour correspondre à la ligne, mais nous pouvons utiliser
substr
:Nous testons d'abord si le deuxième caractère est un point, puis ajoutons un zéro au début de la ligne si c'est le cas. La dernière invoque l'action par défaut d'imprimer la ligne après toute modification.
la source
Vous avez dit awk et sed, mais il semble que vous essayez de formater une date et pour cela j'utiliserais la
date
commande. Par exemple:affichera
La
sed
commande au milieu change les périodes en barres obliques pour la saisiedate -d
. Les options de format permettent une sortie dans presque tous les formats souhaités. En%m
particulier, le zéro sera complété le mois, ce qui semble être ce que vous essayez de faire.Comme le souligne Kusalananda:
Encore plus compact (date GNU et Bash):
date -f <(tr '.' '/' <dates.in) '+%m.%d.%Y %T'
la source
date -f <(tr '.' '/' <dates.in) '+%m.%d.%Y %T'
s|\.|/|g
. Sinon, comme indiqué ci-dessus: belle prise, +1Une stratégie différente de celle présentée dans les autres réponses: vous pouvez utiliser "." comme séparateur de champ.
Vous pouvez jouer au golf pour:
Pour sed, il y a une commande plus courte, présentée dans une autre (excellente) réponse.
la source
awk -F. '{print ($1<10?0$0:$0)}' file
Avec sed ça pourrait être
Cela servira
^
à ancrer au début de la ligne, puis à capturer n'importe quel caractère unique dans un groupe, suivi d'un littéral.
, puis de toute autre chose. Si nous correspondons à ce que nous imprimons a0
, alors notre premier groupe de capture (le caractère au début de la ligne), puis a.
puis notre deuxième groupe de capture (le reste de la ligne)la source
&
est votre ami. Voir l'exemple sed de Kusalananda.sed
qui pourrait être utile dans d'autres situations, pas seulement ce problème spécifique