Découper un mot en syllabes

Voici un script qui permet de découper un ou plusieurs mots en syllabes.

Merci à http://www.bertrandboutin.ca/Folder_151_Grammaire/P_b_division.htm pour la définition des syllabes.

Ce script peut être téléchargé ICI. ou via mon GitLab

Il s'utilise de cette manière :

$ ./syllabes.sh mot1 mot2 mot3 mot4 etc etc ...

Le script accepte au minimum un mot.

Voici le détail du script avec un maximum de commentaires :

$ cat syllabes.sh
#!/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 affiche le résultat
        _MOT=$(sed "s/^-//" <<< "$_MOT")
        echo -e "$MOT => $_MOT"

done

exit 0