Les scripts Shell peuvent utiliser des pipes.
cat "$@" |
tr -cs "a-zA-Z0-9." '\012' |
{
old="aaa."
while read new
do
case "$old" in
*.) : OK;;
*) echo "$old $new";;
esac
old="$new"
done
}
Le code utilise cat
comme collecteur universel de données - tr
est un filtre pur qui n'accepte aucun argument de nom de fichier. L'idée de base est que la variable old contient le premier mot, et new lit le nouveau mot. Lorsque old se termine par un point (comme c'est le cas au début), il ne constitue pas un bigramme valide selon vos règles. Si vous voulez supprimer les points des bigrammes se terminant par des phrases, vous pouvez utiliser :
echo "$old ${new%.}"
La version non ornée (avec des points émis) fonctionne avec le shell Bourne ainsi qu'avec ses dérivés ; la version avec le ${new%.}
fonctionne uniquement avec le shell Korn et ses dérivés - pas le shell Bourne d'origine.
Si vous devez utiliser des fichiers temporaires, alors faites en sorte que leurs noms contiennent l'identifiant de processus ($$) et utilisez trap pour les supprimer :
tmp=${TMPDIR:-/tmp}/bigram.$$
trap 'rm -f $tmp.?; exit 1' 0 1 2 3 13 15
...code using $tmp.1, $tmp.2, etc...
rm -f $tmp.?
trap 0
Le signal 1 est déconnexion (HUP), 2 est interruption (INT), 3 est quitter (QUIT), 13 est pipe (PIPE) et 15 est terminer (TERM) ; 0 est 'toute sortie' et est presque juju dans ce contexte. Avant de réellement quitter, n'oubliez pas d'annuler le trap de sortie, comme le montre l'exemple.