Come rimuovo gli zeri iniziali dall'output di 'date' o evito l'interpretazione ottale di tali numeri decimali?


37

Ho questo:

date +"%H hours and %M minutes"

Uso il festival per dirlo .. ma dice: "zero nove ore" .. Voglio che dica "nove ore"!

ma la data mi dà sempre 09 ... quindi mi chiedo se bash può facilmente farlo diventare solo 9?

nella complessa sceneggiatura ho provato come

printf %d 09

ma fallisce .. non ottale :(

qualche idea?


OP, la tua risposta accettata è ottima, per il tuo caso specifico, ma non corrisponde al titolo della domanda.
einpoklum - ripristina Monica il

@ilkkachu il vecchio titolo è stato fondamentale per me trovare questa domanda, cercando di forzare l'interpretazione decimale dei numeri in formato ottale.
Muru,

@muru, sì, ho pensato che se avessi potuto appiccicare la nota sull'ottale lì, ma non ho trovato un bel fraseggio. Potresti cambiarlo ovviamente, almeno sai cosa hai cercato? Le risposte e la domanda sembrano ancora riguardare la rimozione dello zero iniziale.
ilkkachu,

Risposte:


49
  • Nel tuo caso, puoi semplicemente disabilitare lo zero padding aggiungendo -dopo %nella stringa di formato della data:%-H

    Per impostazione predefinita, i campi numerici dei blocchi data sono con zero. I seguenti flag facoltativi possono seguire '%':

    • - (trattino) non riempie il campo
    • _ (trattino basso) pad con spazi
    • 0 (zero) pad con zeri
    • ^ usare maiuscole se possibile
    • # usare il caso opposto se possibile

    Vedi il manuale della data

  • Se vuoi interpretare il numero in base diversa, in bash

    • Le costanti con uno 0 iniziale sono interpretate come numeri ottali.
    • Uno 0x o 0X iniziale indica esadecimale.
    • Altrimenti, i numeri assumono la forma [base #] n, dove base è un numero decimale compreso tra 2 e 64 che rappresenta la base aritmetica e n è un numero in quella base

    Quindi, per interpretare un numero come decimale, utilizzare la 10#nforma, ad es.10#09

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

    Vedi la sezione Valutazione aritmetica del manuale di bash.


2
grazie, molto dettagliato! tra l' echo $((011)) $((10#011))altro , è un altro buon esempio che esce9 11
Aquarius Power il

1
Questo non funziona per i numeri negativi: lat=048 ; latd=${lat#0} ; echo $((latd-1))funziona, ma lat=-048 ; latd=${lat#0} ; echo $((latd-1))non funziona.
Luis A. Florit,

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

2

Se stai provando a fare confronti in decimali con valori di data, ho trovato questo metodo molto efficace:

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

Ciò produce sempre un valore decimale. Quindi posso farlo:

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

Non ci sono problemi con 08 o 09 in questo modo. L'uso di% 10 invece di% 100 ti dà intervalli di dieci minuti da 0 a 9. Trovo anche i seguenti valori decimali, senza zeri iniziali:

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

2

Portabilmente, puoi rimuovere facilmente un lead 0da una variabile. In questo modo la variabile rimane invariata se non è presente un valore iniziale 0.

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

In bash, ksh o zsh, puoi usare i pattern glob aggiuntivi di ksh per rimuovere qualsiasi numero di 0s iniziali . In bash, corri per shopt -s extglobprimo. In zsh, esegui setopt kshglobprima.

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

1

In generale in bash:

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

con il risultato di

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

Oppure, diverso:

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

Sono sorpreso che la data non abbia opzioni di formato appropriate.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.