SED + addition calculation before substitution

Merci beaucoup @MicP, bonjour :slight_smile: J’n’suis pas RH :clown_face: :relaxed:

Et si je te demandais,

que je ne sais pas si le nombre est de 1 ou 2 ou 3 ou 4 caractères ou plus :wink: - c’est pour le « tuto » ici-même. Je devrais écrire comment ? Comme cela ?

michel@deb114x:~$ nbr=${val:8:*}

ou michel@deb114x:~$ nbr=${val:8:strlen(val)}

¿ comment compter le nombre de caractères d’une valeur d’une $variable en BASH ? comme strlen en PHP - Merci.

Sinon, je trouve cela plus logique, merci - ok - avec des expressions régulières c’est normal puisque on a « piquer » les 4 premiers caractères, donc, on continue de 0 plus 2 etc… dans la/les parenthèses capturantes :

  1. pour la date de 0 plus 4 caractères
  2. pour le mois de 4 plus 2 caractères.
  3. pour le jour de 6 plus 2 caractères.

Et en plus, pourrais tu m’expliquer le $(printf '%02d') à quoi ou comment on s’en sert.

  • printf ¿ permet de récupérer des valeurs avec % :confused: comment dit-on ; en cache ?
  • %02 ¿ correspond à quoi ?
  • d ¿ correspond à quoi ?
  • ${nbr#0*} ¿ est, doit être la valeur entière (#0) de la variable $nbr dirais-je. Étoile (*) - pourquoi ? :slight_smile:

Merci encore @MicP !

Romain :slight_smile:

Tiens au fait çà me fait penser à cela - UN GROS TRUC QUI FAIT TROP PEUR :star_struck: (en espérant que vous savez çà depuis le début - avant de faire - de commencer l’informatique :confused: :upside_down_face: et de ne pas avoir de fausses données, ou ne pas avoir des statistiques trompeuses etc ^^ :

echo $((145/8*456)) mauvais calcul , retourne 8208 !!
echo 145/8*456 | bc -l calcul correct, retourne 8265.00000000000000000000

ou encore :
echo 12*3.02 | bc -l calcul correct, arrive bien à multiplier avec la virgule, retourne 36.24 .

# echo $((12*3.02))
bash: 12*3.02 : erreur de syntaxe : opérateur arithmétique non valable (le symbole erroné est « .02 »)
Vous avez du nouveau courrier dans /var/mail/root
# echo $((12*3,02))
2

CALCUL FAUX !

apt show bc
...
Description: langage de calculateur de précision arbitraire bc GNU
 GNU bc est un langage algébrique interactif avec une précision arbitraire
 qui suit le standard préliminaire POSIX 1003.2, avec plusieurs extensions
 incluant des noms de variables multicaractères, une instruction « else » et
 des expressions booléennes complètes. GNU bc ne nécessite pas le programme
 séparé GNU dc.

Cordialement,
Romain

IMG20220924151448

NdMoi-même : Je ne sais même plus faire de division sur papier :sob:

:wink:

Super site : http://www.gecif.net :wink: c’est qui ? ici :relaxed:

Super page : linux / #shell : Awk, Sed et Grep

J’aime bien cette ligne :

:wink:

Si on ne sait pas quel est le nombre de caractères qui suivent le 8ème caractère de la chaîne de caractères qui a été assignée comme valeur à la variable nommée nbr, il suffira de ne pas spécifier ce nombre de caractères :

michel@deb114x:~$ val=202109231
michel@deb114x:~$ echo ${val:8}
1
michel@deb114x:~$ 
michel@deb114x:~$ val=20210923000001
michel@deb114x:~$ echo ${val:8}
000001
michel@deb114x:~$ 

michel@deb114x:~$ val=2021092301
michel@deb114x:~$ echo ${#val}
10
michel@deb114x:~$ 
michel@deb114x:~$ val=20210923000001
michel@deb114x:~$ echo ${#val}
14
michel@deb114x:~$ 

Voir le manuel de la commande printf :

man printf

printf '%02d' $valeurDécimaleÀformater

La chaîne de formatage :

  • Compléter avec des zéros
  • Jusqu’à ce que le nombre soit affiché sur deux chiffres
  • La valeur à formater qui est donnée en paramètre est une valeur décimale

${nbr#0*}
C’est tombé en marche dans ce cas précis, mais en fait je me suis trompé,
j’aurais plutôt dû utiliser : ${nbr##+(0)}

<=> supprimer le suite de caractères 0 qui sont au début de la chaîne de caractères qui a été assignée à la variable nommée nbr

michel@deb114x:~$ nbr='000010020345'
michel@deb114x:~$ echo ${nbr##+(0)}
10020345
michel@deb114x:~$ 
michel@deb114x:~$ nbr='aaaaaaxyz'
michel@deb114x:~$ echo ${nbr##+(a)}
xyz
michel@deb114x:~$ 
1 J'aime

C de toi çà … http://www.gecif.net/ merci <3 ou, tu fais exprès …

pardon, oui, donc, le huitième … caractères … oui…

Ah ok…

Ok… décimale comme d et donc, 2 chiffes (décimal, donc :heart_eyes:)…

OK, …pfff… super génial. mme.c.fe je t’aime !

:heartpulse:

Merci pour cette explication #MicP (je met un tag exprès) ;p

Comment s’appelle t’il.elle sur d’autres réseaux sociaux. :rofl:

. (point)

Au fait comment fait-on un point du milieu ?

  • il y a le point médian dont le point de code unicode est U+00B7

  • Il y a celui qui est utilisé en mathématiques comme signe de multiplication
    dont le point de code unicode est U+22C5

  • Il y a la puce typographique dont le point de code unicode est U+2022 qui est souvent utilisée pour structurer des énumérations (comme par exemple les 3 énumérations qui sont dans ce message)


Pour faire s’afficher un caractère en utilisant son point de code unicode,
faire Ctrl+Maj+u et un u (en lettre minuscule) souligné s’affichera
pour nous inviter à entrer la valeur hexadécimale du point de code unicode.
Donc, par exemple, pour faire s’afficher la puce typographique,
il ne restera plus qu’à entrer : 2022


Avec la disposition clavier Français (variante)
on peut faire s’afficher le point milieu utilisé pour la multiplication (U+22C5) en appuyant
simultanément sur la Maj et la touche étoile du pavé numérique : Maj+*

1 J'aime

Okay merci beaucoup @MicP :slight_smile: pour toutes ces explications.

Je cherchais ce type de point -> ·

Faire le point milieu de l’écriture inclusive avec un clavier ?

  • Sur Mac, il est possible d’obtenir le point milieu en faisant la combinaison de touche ALT + MAJ + F.
  • Sur Windows, il faut utiliser la combinaison de touche ALT + 0183. Bref, pas facile… - je n’y arrive pas. Ce n’est pas grave. L’astuce est de faire un copier / coller depuis un texte existant :slight_smile:

Bonne journée à vous.

Encore merci pour ces explications très technique.

C’est le point médian :
celui dont le nom unicode est MIDDLE DOT
celui qui a le point de code unicode U+00B7
et dont l’entité HTML est &#183;


Si besoin, tu pourras retrouver tous les caractères unicode dans cette page web


Si tu utilises l’environnement de bureau XFCE,
tu pourrais lancer, depuis ton compte utilisateur non privilégié
cette ligne de commandes :

echo "keycode  59 = semicolon period semicolon period U00B7 U22C5 U00B7 U22C5" > ~/.Xmodmap

Et après le démarrage suivant de ta session XFCE (<=> Déconnexion… et s’identifier à nouveau),
tu pourras faire s’afficher un point médian en utilisant le raccourci clavier AltGr+;
<=> appuyer sur la touche AltGr
et tout en la maintenant appuyée, appuyer ensuite sur la touche ;

Sinon, il faudra me dire quel est l’environnement de bureau que tu utilises.

1 J'aime

Merci oui d’accord.

Ok merci :slight_smile:

Ok - Merci beaucoup @MicP - Bon dimanche.

Bon dimanche à toi aussi.

1 J'aime

Ok merci - je n’avais pas vu la réponse à ma question.

J’allais dire c’est la même chose pour récupérer le nombre d’arguments dans un script mais ce n’est pas pareil.

Exemple : nano exemple.sh && chmod u+x exemple.sh

#!/bin/sh

echo "$# args in script $(basename ${0})"
echo "${#} args in script $(basename ${0})"
echo "${$#} ???? - script $(basename ${0})"
#echo "${#arg1} ???? - script $(basename ${0})"

echo ""
echo "Pour le fun ;)"
echo "Comment récuperer les args ?"
echo "Premier argument dans la ligne de commande $1"
echo "Deuxième argument dans la ligne de commande $2"
echo ""
echo "Est-ce obligé de faire une boucle et un switch -> case ? Et cela sur (tous) le nombres d'arguments envoyé ?"
echo ""
echo "HS ;)"

Exec :

./exemple.sh arg1=val1 arg2

Output :

2 args in script exemple.sh
2 args in script exemple.sh
19280 ???? - script exemple.sh

Pour le fun ;)
Comment récuperer les args ?
Premier argument dans la ligne de commande arg1=val1
Deuxième argument dans la ligne de commande arg2

Est-ce obligé de faire une boucle et un switch -> case ? Et cela sur (tous) le nombres d'arguments envoyé ?

HS ;)

:wink:

On peut utiliser la commande interne shift

Voir la page du manuel de bash concernant la commande shift
en lançant la ligne de commandes suivante :
man --pager='less -p "shift \["' bash

Voir aussi : Bash Guide for Beginners → 9.7. The shift built-in

et : Computer Hope → Bash shift builtin command

1 J'aime

Merci beaucoup @MicP :slight_smile:

Tiens, tu m’as bien dis que c’était en BASH petit·e malin·e :slight_smile:

Je fais un script .sh que je suis entrain d’écrire - je le met ici tiens :relaxed:.

Par exemple :

#!/bin/sh
SOA="20210923000001"  | egrep -ho '[0-9]{8,}')
SERIAL_SOA="$(echo ${SOA:8})"

Me retourne une erreur sur les deux-points : de la variable → ${SOA:8} :slight_smile:

Je cherche… heu… je sors :sweat_smile: avant que le bureau de « tabac » ferme :slight_smile: vive la montagne.

#!/bin/sh
…

Ce shebang indique que ce script devra être interprété par le shell accessible par /bin/sh
Le shell accessible par le fichier de type lien /bin/sh est :

michel@deb114x:~$ readlink -f /bin/sh
/usr/bin/dash
michel@deb114x:~$

Donc, ce n’est pas le shell bash qui interprétera les lignes de commandes contenues dans ce script,
mais le shell dash


…
SOA="20210923000001" …

Il vaut mieux utiliser des caractères en lettre minuscules pour nommer les variables créées dans un script car ça permet de différencier plus facilement les variables crées dans et pour le script
des variables d’environnement dont les noms sont en lettre majuscules


…
SOA="20210923000001"  | egrep -ho '[0-9]{8,}')
…

La parenthèse finale est sans doute une erreur de frappe.

…
SOA="20210923000001"  | egrep -ho '[0-9]{8,}'
…

Comme la commande d’affectation précédant la commande pipe | ne retourne aucune sortie,
la commande pipe | ne retournera rien en entrée de la commande egrep
donc, la commande egrep ne retournera rien non plus en sortie.

D’autre part, la commande grep est utilisée pour extraire des lignes d’un fichier texte

Voir :

man grep

soa="20210923000001"
serial_soa="$(echo ${soa:8})"

la syntaxe ${soa:8} fonctionne avec l’interpréteur de commande bash
mais elle ne fonctionnera pas avec l’interpréteur de commande dash


Avec le shell bash

Il n’est pas nécessaire d’utiliser la commande echo pour affecter à la variable nommée serial_soa la valeur correspondant aux derniers caractères qui suivent le 8ème caractère de la valeur qui aurait été affectée à la variable nommée soa

michel@deb114x:~$ soa="20210923000001"
michel@deb114x:~$ serial_soa="${soa:8}"
michel@deb114x:~$ 
michel@deb114x:~$ echo "$serial_soa"
000001
michel@deb114x:~$ 

Oui, ok, sûr !

Oui, bien… Ce n’est pas bête, c’est mieux… nous sommes Humain·e·s :wink:

oui le script est

oui

oui

Bon, bonne soirée :smiley: à vous.tous.toutes !