syllabes.sh 2.47 KB
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
#!/bin/bash

# Activer pour le debug
#set -x

function preRequis {
for arg in $@; do
if ! which $arg >/dev/null; then
echo "La commande $arg n'est pas installée !!!"
echo "Fin du script."
exit 1
fi
done
}

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"

preRequis egrep sed

# Si le nombre d'arguments passé au script est inférieur à 1
# On quitte le script immédiatement.
if [ $# -lt 1 ]; then
echo "Usage: `basename $0` mot1 [mot2 mot3 ...]"
exit 1
fi

# Liste des voyelles
VOY="aeiouyàâäéèêëîïôöùûü"
# Liste des consonnes
CONS="zrtpqsdfghjklmwxcvbnç"
# Liste des groupes de lettres insécables
GR="bl cl fl gl pl br cr dr fr gr pr tr vr ch ph gn th"

for MOT in $@; do

# On convertit toutes les majuscules en minuscules
_MOT=$(tr "[A-Z]" "[a-z]" <<< "$MOT")

# On exécute la première règle de découpe des syllabes
# avec les groupes de lettres insécables.
for _GR in $(echo $GR); do
_MOT=$(sed "s/$_GR/-$_GR/g" <<< "$_MOT")
done

# Boucle infinie
while :; do

# Une consonne placée entre deux voyelles introduit une nouvelle syllabe.
if SYL=$(grep -E -o "[$VOY]{1}[$CONS]{1}[$VOY]{1}" <<< "$_MOT"); then
for __SYL in $SYL; do
_SYL=$(sed -r "s/^(.)(.{2})$/\1-\2/" <<< "$__SYL")
_MOT=$(sed "s/$__SYL/$_SYL/" <<< "$_MOT")
done
continue
fi
# Deux consonnes placées entre deux voyelles,
# la première appartient à la syllabe précédente,
# la seconde, à la syllabe suivante.
if SYL=$(grep -E -o "[$VOY]{1}[$CONS]{2}[$VOY]{1}" <<< "$_MOT"); then
for __SYL in $SYL; do
_SYL=$(sed -r "s/^(.{2})(.{2})$/\1-\2/" <<< "$__SYL")
_MOT=$(sed "s/$__SYL/$_SYL/" <<< "$_MOT")
done
continue
fi
# Quand il y a trois consonnes ou voyelles consécutives à l’intérieur d’un mot,
# ordinairement les deux premières terminent une syllabe,
# l’autre commence une nouvelle syllabe.
if SYL=$(grep -E -o "[$CONS]{3}|[$VOY]{3}" <<< "$_MOT"); then
for __SYL in $SYL; do
_SYL=$(sed -r "s/^(.{2})(.)$/\1-\2/" <<< "$__SYL")
_MOT=$(sed "s/$__SYL/$_SYL/" <<< "$_MOT")
done
continue
fi
# On quitte la boucle infinie si aucune des conditions précédentes n'est vraie
break
done

# On corrige quelques erreurs
_MOT=$(sed "s/^-//" <<< "$_MOT")
_MOT=$(sed -r "s/^(.*)-([$VOY]{1})$/\1\2/" <<< "$_MOT")
# On affiche le résultat
echo -e "$MOT => $_MOT"

done

exit 0