Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

bash, texte en forme de triangle

2 réponses
Avatar
dyrmak
Bonjour,

Je voulais écrire un petit programme bash pour
triangulariser du texte:

./triangletxt cristallin
c
cr
cri
cris
crist
crista
cristal
cristall
cristalli
cristallin

./triangletxt été
é
ét
été

Pour moi ça ça marche ouf... Pas de soucis !... Néanmoins ce petit
programme n'a pas été facile à mettre au point, dans les sources
que j'indique ci-dessous, vous voyez que j'ai tenté d'utiliser
les commandes cut,awk,head ( tail aussi par la même occasion )
mais aucune de ces commandes n'a fonctionné correctement dans ce
contexte.

Les commandes cut et head se brouillent avec les caractères accentués
et la commande awk qui ne s'en brouille pas si on l'exécute de manière
isolée, se mélange les pinceaux dans une boucle et prend $k comme
kème paramètre d'entrée du bash au lieu de le prendre comme indice
de boucle. La séquence qui n'est pas commentée est la seule qui
fonctionne, mais elle ne me satisfait pas car au fond, je ne la comprends pas!

Merci par avance si vous avez le temps de donner vos commentaires sur
la raison du pourquoi et du comment ces séquences de code ne fonctionnent
pas comme je m'y attendais.

cat triangletxt
---------------------------------------------------------
#!/bin/bash

var="$1"

#echo "the length of variable $1 is $(expr length $1) "
echo "The length of argument '$var' is: ${#var}"

### here we need to shape $1, so we can smoothly produce
# dynamic showing text....
#
:>trianglecol

for k in `seq 1 ${#var}`;
do
#echo $var |head -c $k >> trianglecol
#echo >> trianglecol
#echo $1 |cut -c $k >> trianglecol
#echo $var | awk '{print substr($0,1,$k);exit}' >> trianglecol
tri=$(echo $var)
echo ${tri:0:$k} >> trianglecol

done

cat trianglecol
exit
------------------------------------------------------

dyrmak
--
Menos por más da menos
++++ --- ++++
Linux operating system
++++ --- ++++

2 réponses

Avatar
Francois Lafont
Salut,

On 26/06/2015 12:05, dyrmak wrote:

Je voulais écrire un petit programme bash pour
triangulariser du texte:

./triangletxt cristallin
c
cr
cri
cris
crist
crista
cristal
cristall
cristalli
cristallin

./triangletxt été
é
ét
été



Petit exercice assez rigolo, du coup j'ai voulu faire ma version.
Attention j'utilise le shell /bin/sh de ma Debian Wheezy qui n'est
pas /bin/bash (mais le script marchera tout autant sur bash
normalement). Le voici :

-------------------------------------
#!/bin/sh

word="$1"
line=''

for letter in $(echo "$word" | sed -r 's/(.)/1 /g')
do
line="${line}${letter}"
echo "$line"
done
-------------------------------------

~$ /tmp/test.sh éléphant
é
él
élé
élép
éléph
élépha
éléphan
éléphant

L'idée c'est juste « d'éclater » le mot passé en argument en une
suite de lettres séparées par des espaces ce que fait le sed
ci-dessus (où chaque lettre est remplacée par "elle-même + un espace".

Voilà, désolé, je ne réponds pas vraiment à ta question à propos
de ton code à toi mais j'ai l'impression que tu utilises pas mal
de syntaxes propres à bash et que ne sont pas compatibles avec
la norme POSIX. Certains appellent cela des « basheries » et perso
j'essaye de les éviter le plus possible, d'autant plus qu'on peut
en général s'en passer sans problème.

Une autre remarque, c'est que, dans ton script, tu écris dans un
fichier. Pour faire ce que tu souhaites, ça me semble inutiles.
Et si dans un script on peut éviter une écriture sur le disque,
il ne faut pas se gêner.

Voilà.

--
François Lafont
Avatar
dyrmak
En 72 lignes Francois Lafont a écrit
dans news:558d5600$0$3392$
le vendredi, 26 juin 2015 à 15:39:12 :

Salut,

On 26/06/2015 12:05, dyrmak wrote:

Je voulais écrire un petit programme bash pour
triangulariser du texte:

./triangletxt cristallin
c
cr
cri
cris
crist
crista
cristal
cristall
cristalli
cristallin

./triangletxt été
é
ét
été



Petit exercice assez rigolo, du coup j'ai voulu faire ma version.
Attention j'utilise le shell /bin/sh de ma Debian Wheezy qui n'est
pas /bin/bash (mais le script marchera tout autant sur bash
normalement). Le voici :

-------------------------------------
#!/bin/sh

word="$1"
line=''

for letter in $(echo "$word" | sed -r 's/(.)/1 /g')
do
line="${line}${letter}"
echo "$line"
done
-------------------------------------

~$ /tmp/test.sh éléphant
é
él
élé
élép
éléph
élépha
éléphan
éléphant

L'idée c'est juste « d'éclater » le mot passé en argument en une
suite de lettres séparées par des espaces ce que fait le sed
ci-dessus (où chaque lettre est remplacée par "elle-même + un espace".

Voilà, désolé, je ne réponds pas vraiment à ta question à propos
de ton code à toi mais j'ai l'impression que tu utilises pas mal
de syntaxes propres à bash et que ne sont pas compatibles avec
la norme POSIX. Certains appellent cela des « basheries » et perso
j'essaye de les éviter le plus possible, d'autant plus qu'on peut
en général s'en passer sans problème.

Une autre remarque, c'est que, dans ton script, tu écris dans un
fichier. Pour faire ce que tu souhaites, ça me semble inutiles.
Et si dans un script on peut éviter une écriture sur le disque,
il ne faut pas se gêner.

Voilà.



Excellent ! Depuis plusieurs jours j'étais bloqué par ce script et pour
cause, je n'arrivais pas à le faire fonctionner, si j'avais donné
ma langue au chat, j'aurais eu alors une solution toute faite et tout
comme il faut pour ce que j'avais à faire, merci !
En fait cette version que j'ai proposée est ma version de test,
c'était le chaînon qui manquait à un programme plus important,
un compilateur de vhooks qui génère du texte animé à la volée et
ce programme va aussi compiler au besoin des commandes pour
les versions récentes de ffmpeg.

dyrmak
--
¿ De quién fue la culpa ? No sé de la suerte
++++ --- ++++
Linux operating system
++++ --- ++++