2 votes

Modifier la casse du premier mot de chaque ligne

En ligne de commande, Comment mettre en majuscule chaque premier mot d'une ligne dans un fichier texte ?

Exemple d'entrée :

hello   world  
tell    me who you are!  

Exemple de sortie :

HELLO   world  
TELL    me who you are!  

Il n'y a pas de lignes vides, c'est de l'ASCII, et chaque ligne commence par un mot alphabétique suivi d'un onglet .

Outils à utiliser : tout ce qui fonctionne en ligne de commande sur macOS (bash 3.2, BSD sed, awk, tr, perl 5, python 2.7, swift 4, etc.)

2voto

David C. Rankin Points 2674

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?

1voto

codeforester Points 17582

Utilisation awk un seul mot :

awk -F$'\t' -v OFS=$'\t' '{ $1 = toupper($1) }1' file

1voto

etopylight Points 941

Utilisation GNU sed :

sed 's/^\S*/\U&/g' file

\S correspond à un caractère autre qu'un espace blanc et \U& met en majuscules le motif recherché

MISE À JOUR : en cas de BSD sed Comme il ne prend pas en charge la plupart de ces caractères spéciaux, c'est encore possible, mais cela nécessite une expression beaucoup plus longue.

sed -f script file

où le script contient

{
    h
    s/ .*//
    y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
    G
    s/\(.*\)\n[^ ]* \(.*\)/\1 \2/
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X