Tout d'abord récupérer dans une variable le texte sélectionné ⇔ selection=$(xsel -o | tr "\n" " "). Le paquet xsel doit être installé et tr est utilisé pour supprimer les retours chariot.

Le changement de casse est pris directement en compte par les versions de bash ≥ 4 : $(myVar^^) pour tout passer en majuscule, $(myVar,,)  pour tout passer en minuscule, man bash section "Parameter Expansion" pour en savoir plus. Curieusement il manque dans la page de man l'explication de $(myVar~~) qui inverse la casse, ce qui peut s'avérer bien pratique.

Remplacer un caractère par un autre est classiquement le travail de sed ⇔ echo $selection | sed "s/\./,/g"

Pour la traduction j'ai trouvé mon bonheur sur un forum de crunchbang. J'ai repris et adapté la fonction et remercie ici son auteur. Si quelqu'un a une solution équivalente sans Google je suis preneur. Le paquet html2text doit être installé.

Pour manipuler le presse-papier en lignes de commande il existe l'outil xclip (du paquet du même nom). xclip -i -selection clipboard pour écrire dans le presse-papier, xclip -o -selection clipboard pour lire. man xclip pour plus de détails.

Enfin pour les notifications voir notify-send du paquet libnotify (pas de page de man ⇒ notify-send --help)

Reste à appeler le script avec les paramètres qui vont bien, ce que je fait, faute de mieux, avec les raccourcis clavier de mon environnement de travail. Avec OpenBox c'est relativement cool car les raccourcis claviers peuvent comporter des raccourcis secondaires (child keybind) à la Emac. Par exemple Ctrl-Y suivi de la lettre u pour mettre en majuscules ou Ctrl-Y suivi de la lettre l pour passer en minuscules. Voir le wiki d'openbox pour des explications plus claires (mais en anglais). Je ne sais pas si cela est possible dans d'autres environnements.

Quoiqu'il en soit cette solution n'est pas très élégante, mais je n'ai pas trouvé mieux.

Mon script scopy :

#! /bin/bash 
# dépendance xclip html2text libnotify
IFS=$'\n'
NotifyTime=5000
traduction ()
{
# fonction provenant d'un script de Johnraff sur le forum de crunchbang
# http://crunchbang.org/forums/viewtopic.php?id=17034
result=$(curl -s -i --user-agent "" -d "sl=auto" -d "tl=$1" --data-urlencode "text=$selection" https://translate.google.com)
encoding=$(awk '/Content-Type: .* charset=/ {sub(/^.*charset=["'\'']?/,""); sub(/[ "'\''].*$/,""); print}' <<<"$result")
trad=$(iconv -f $encoding <<<"$result" |  awk 'BEGIN {RS="</div>"};/<span[^>]* id=["'\'']?result_box["'\'']?/' | html2text | tr "\n" " ")
}
selection=$(xsel -o | tr "\n" " ")
case $1 in
u) # tout en majuscule
echo ${selection^^}  | xclip -i -selection clipboard;;
l) # tout en minuscule
echo ${selection,,}  | xclip -i -selection clipboard;;
i) # casse inverse
echo ${selection~~}  | xclip -i -selection clipboard;;
v) # remplace le point par une virgule
echo $selection |  sed "s/\./,/g" | xclip -i -selection clipboard;;
p) # remplace la virgule par un point
echo $selection | sed 's/,/\./g' | xclip -i -selection clipboard;;
a) # traduit de auto en anglais
traduction "en"
NotifyTime=15000
echo $trad | xclip -i -selection clipboard;;
f) # traduit de auto en français
traduction "fr"
NotifyTime=15000
echo $trad | xclip -i -selection clipboard;;
*) # cas non prévus
echo "usage inattendu" | xclip -i -selection clipboard
esac
notify-send --icon=dialog-information -t $NotifyTime "scopy" $(xclip -o -selection clipboard)