Vous pouvez toujours utiliser la conversion de cas de bash et une boucle while pour accomplir ce que vous voulez, par exemple
$ while read -r a b; do echo "${a^^} $b"; done < file
HELLO world
HOW are you?
Les expansion des paramètres ${var^^}
convertit tous les caractères en var
en majuscules, ${var^}
convertit la première lettre.
Bash 3.2 - "tr
Pour les versions antérieures de bash, vous pouvez utiliser la même configuration avec tr
avec un herestring pour gérer la conversion des cas :
$ while read -r a b; do echo "$(tr [a-z] [A-Z] <<<"$a") $b"; done file
HELLO world
HOW are you?
Préserver \t
Personnages
Pour préserver les mots séparés par des tabulations, il faut éviter les coupures de mots pendant la lecture. Malheureusement, la -d
à l'option read
n'autorise pas la terminaison sur un ensemble de caractères. Un moyen de contourner la vérification des deux spaces
ou tab
La lecture des mots délimités est la lecture de la ligne entière en désactivant le découpage des mots avec la fonction IFS=
puis en avançant dans la ligne jusqu'au premier littéral $' '
ou $'\t'
est trouvé. (les littéraux sont bash-only, pas POSIX shell) Une implémentation simple serait :
while IFS= read -r line; do
word=
ct=0
for ((i = 0; i < ${#line}; i++)); do
ct=$i
## check against literal 'space' or 'tab'
[ "${line:$i:1}" = $' ' -o "${line:$i:1}" = $'\t' ] && break
word="${word}${line:$i:1}"
done
word="$(tr [a-z] [A-Z] <<<"$word")"
echo "${word}${line:$((ct))}"
done <file
Sortie de tab
Mots séparés
HELLO world
HOW are you?