J'ai la commande suivante que j'essaye de modifier:
stat -c %y test.txt | sed 's/^\([0-9\-]*\)/\1/'
Cela retourne les informations suivantes:
2016-08-03 14:52:24.000000000
J'ai besoin de modifier cela pour qu'il exclue le ".000000000". J'ai essayé plusieurs options mais je n'arrive pas à comprendre. En fin de compte, je dois prendre l’horodatage que j’extrais de la commande ci-dessus et l’échanger en tant que première ligne du fichier.
J'ai comme exemple cette commande qui semble ajouter correctement une nouvelle ligne en haut du fichier:
sed -i '1s/^/this should be a date\n/' test.txt
Comment combiner les deux commandes?
sed -i "1i$(stat -c %y test.txt | sed -r 's/\.[0-9]+ / /')" test.txt
Ainsi:
( stat -c %y test_file.txt | awk -F '.' '{print $1}' ; cat test_file.txt ) > /tmp/temp_file && mv /tmp/temp_file test_file.txt
Voici une petite démo:
$> echo "Hello World" > test_file.txt
$> ( stat -c %y test_file.txt | awk -F '.' '{print $1}' ; cat test_file.txt ) > /tmp/temp_file &&
> mv /tmp/temp_file test_file.txt
$> cat test_file.txt
2016-08-03 09:24:27
Hello World
Explication:
(...)
stat -c %y test_file.txt | awk -F '.' '{print $1}'
horodatage des découpescat test_file.txt
lit le contenu du fichier./tmp/temp_file
/tmp/temp_file
Que diriez-vous d'utiliser ed
au lieu de sed
?
$ ed -s test.txt << EOF
0r !stat -c \%y %
1 s/\.[0-9]*//
w
q
EOF
Cela dit:
stat -c \%y %
et insérez-le à la position 0 dans le tampon, c'est-à-dire avant la première ligne. Notez que dans ed
, un n échappé %
est un raccourci pour le fichier en cours.Le -s
est facultatif - il empêche simplement ed
de générer des décomptes de lignes. Si stat
ajoute un décalage de fuseau horaire dans vos paramètres régionaux et que vous souhaitez également le supprimer, vous pouvez modifier la commande s
pour supprimer le point et tout ce qui le suit, par exemple. s/\..*//
Il est également possible d'utiliser ed
dans une ligne, en prenant ses commandes depuis l'entrée standard à l'aide de echo
ou printf
, bien qu'il soit un peu difficile de réussir l'échappement:
printf '0r !stat -c \%%y %%\n1 s/\.[0-9]*//\nw\nq' | ed -s test.txt