Comment puis-je supprimer les zéros de gauche de la sortie de 'date' ou éviter l'interprétation octale de tels nombres décimaux?


37

J'ai ceci:

date +"%H hours and %M minutes"

J'utilise festival pour le dire .. mais il dit: "zéro neuf heures" .. je veux que ça dise "neuf heures"!

mais la date me donne toujours 09 ... alors je me demande si bash peut facilement faire que ça devienne juste 9?

dans le script complexe, j'ai essayé comme

printf %d 09

mais ça échoue .. pas octal :(

une idée?


OP, votre réponse acceptée est excellente - pour votre cas particulier, mais elle ne correspond pas au titre de la question.
einpoklum - rétablit Monica le

@ilkkachu, l'ancien titre était essentiel pour trouver cette question, cherchant à forcer l'interprétation décimale des nombres au format octal.
Muru

@muru, oui, je pensais que si je pouvais coller la note à propos d'octal, mais je n'ai pas trouvé un phrasé intéressant. Vous pourriez bien sûr le changer, au moins, vous savez ce que vous cherchiez? Les réponses et la question semblent toujours principalement concerner la suppression du zéro non significatif.
ilkkachu

Réponses:


49
  • Dans votre cas, vous pouvez simplement désactiver zéro padding en ajoutant -après %dans la chaîne de format de date:%-H

    Par défaut, les champs de date numériques sont marqués de zéros. Les indicateurs facultatifs suivants peuvent suivre '%':

    • - (trait d'union) ne pas remplir le champ
    • _ pavé (souligné) avec des espaces
    • 0 (zéro) pavé avec zéros
    • ^ utiliser des majuscules si possible
    • # utiliser le cas contraire si possible

    Voir le manuel de date

  • Si vous voulez interpréter le nombre dans différentes bases, en bash

    • Les constantes avec un 0 au début sont interprétées comme des nombres octaux.
    • Un 0x ou 0X au début indique hexadécimal.
    • Sinon, les nombres prennent la forme [base #] n, où base est un nombre décimal compris entre 2 et 64 représentant la base arithmétique, et n est un nombre dans cette base.

    Donc, pour interpréter un nombre comme un nombre décimal, utilisez la 10#nforme, par exemple.10#09

    echo $((10#09*2))
    18

    Voir la section Évaluation arithmétique du manuel de bash.


2
merci, très détaillé! BTW, echo $((011)) $((10#011))est un autre bon exemple qui produit9 11
Aquarius Power

1
Cela ne fonctionne pas pour les nombres négatifs: lat=048 ; latd=${lat#0} ; echo $((latd-1))fonctionne, mais lat=-048 ; latd=${lat#0} ; echo $((latd-1))ne fonctionne pas.
Luis A. Florit

plus=$((10#01))
Dr Beco

2

Si vous essayez de faire des comparaisons décimales avec des valeurs de date, j'ai trouvé cette méthode très efficace:

let mymin=$(date '+1%M') ; let mymin=$mymin%100

Cela donne toujours une valeur décimale. Donc je peux faire ça:

if [[ $mymin -le 1 ]]; then   # only 0 and 1 are true.

Il n'y a pas de problème avec 08 ou 09 de cette façon. L'utilisation de% 10 au lieu de% 100 vous donne une plage de dix minutes allant de 0 à 9. Les résultats suivants donnent également des valeurs décimales, sans zéros au début:

echo "$((10#$(date +%M)))"

2

De manière portable, vous pouvez facilement supprimer un interlocuteur 0d'une variable. Cela laisse la variable inchangée s'il n'y a pas d'interlignage 0.

eval $(date +"h=%H m=%M")
h=${h#0}
m=${m#0}
say "$h hours and $m minutes"

Dans bash, ksh ou zsh, vous pouvez utiliser les modèles globaux supplémentaires de ksh pour supprimer un nombre quelconque de 0s principaux . En bash, lancez le shopt -s extglobpremier. Dans zsh, lancez d' setopt kshglobabord.

eval $(date +"h=%H m=%M")
h=${h#+(0)}
m=${m#+(0)}
say "$h hours and $m minutes"

1

En général en bash:

test ${#number} -eq 2 && number=${number#0}

résultant en

date +"%H %M" | 
{ read hours minutes
hours=${hours#0}
minutes=${minutes#0}
echo "${hours} hours and ${minutes} minutes"; }

Ou différent:

date +"%H hours and %M minutes" | sed -n -e 's/0\([0-9]\)/\1/g' -e p

Je suis surpris que la date n'ait pas les options de format appropriées.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.