Convertir le contenu du fichier en minuscule


85

J'ai un tempfichier avec des contenus minuscules et majuscules.

Contribution

Contenu de mon tempdossier:

hi
Jigar
GANDHI
jiga

Je veux convertir tout haut en bas .

Commander

J'ai essayé la commande suivante:

sed -e "s/[A-Z]/[a-z]/g" temp

mais j'ai eu une mauvaise sortie.

Sortie

Je le veux comme:

hi
jigar
gandhi
jiga

Qu'est-ce qui doit être dans la partie de substitution de l'argument sed?


Réponses:


122

Si votre entrée ne contient que des caractères ASCII, vous pouvez utiliser le trtype suivant:

tr A-Z a-z < input 

ou (moins facile à mémoriser et à taper IMO; sans toutefois se limiter aux lettres latines ASCII, bien que, dans certaines implémentations, y compris GNU tr, toujours limité aux caractères à un octet, donc, dans les paramètres régionaux UTF-8, toujours limité aux lettres ASCII):

tr '[:upper:]' '[:lower:]' < input

si vous devez utiliser sed:

sed 's/.*/\L&/g' < input

(supposons ici la mise en oeuvre de GNU).

Avec POSIX sed, vous devez spécifier toutes les translittérations, puis choisir les lettres à convertir:

sed 'y/AǼBCΓDEFGH.../aǽbcγdefgh.../' < input

Avec awk:

awk '{print tolower($0)}' < input

3
Veuillez noter qu'il \Ls'agit d'une extension GNU.
— Anthon

\Lfonctionne bien pour moi jusqu'à présent. En clair le point que vous essayez de faire l' extension GNU
— JigarGandhi

2
@ JigarGandhi. sedest une commande Unix. Différents systèmes ont différentes variantes avec différents comportements et fonctionnalités. Heureusement, de nos jours, il existe une norme à laquelle la plupart se conforme afin que vous puissiez compter sur un ensemble minimal de fonctionnalités communes à tous. \Ln'est pas parmi eux et a été introduit par GNU sed(correspond au même opérateur dans standard ex/ vi) et n'est généralement pas disponible dans d'autres implémentations.
— Stéphane Chazelas

9
Notez que certaines trimplémentations telles que GNU trne fonctionnent pas correctement dans les paramètres régionaux multi-octets (la plupart d’entre elles le sont actuellement, essayez echo STÉPHANE | tr '[:upper:]' '[:lower:]'par exemple). Sur les systèmes GNU, vous pouvez préférer la sedvariante ou awk« s tolower().
— Stéphane Chazelas

5
Correction légère: sed 's/.*/\L&/g' < input. La \1référence à la sous-chaîne correspondante ne fonctionnera que si vous spécifiez la sous-chaîne avec des parenthèses, comme le fait wurtle. Cependant, il est légèrement plus propre à utiliser &pour représenter l'ensemble du match, comme indiqué
— Edward Brown

30

Avec vim, c'est super simple:

$ vim filename
gg0guGZZ

Ouvre le fichier, ggva à la première ligne 0, première colonne. Avec guG, réduit la casse de tous les caractères jusqu'au bas du fichier. ZZenregistre et quitte.

Il devrait gérer à peu près tout ce que vous lui lancez; ça va ignorer les nombres, ça va gérer les fichiers non ASCII.

Si vous voulez faire le contraire, changez les lettres minuscules en majuscules, remplacez-les upar un U: gg0gUGZZet le tour est joué.


14
Lol "super simple"
— blambert

cela ne va évidemment pas bien pour de nombreux fichiers
— Corey Goldberg

ma réponse la plus préférée à ce jour !!!!
— Mona Jalal

1
@ CoreyGoldberg vim file1 file2 fileetcet quelque chose comme :bufdo gg0guG:w<CR>cela fonctionnerait probablement pour un nombre quelconque de fichiers. Je n'ai pas testé ça!
— TankorSmash

@TankorSmash qui ne s'adapte toujours pas à un grand nombre de fichiers
— Corey Goldberg

17

J'aime ddpour ça moi-même.

<<\IN LC_ALL=C 2<>/dev/null \
dd conv=lcase
hi
Jigar 
GANDHI
jiga
IN

... obtient ...

hi
jigar
ghandi
jiga

Le LC_ALL=Cest de protéger les multibytes en entrée - bien que toutes les capitales multi - octets ne seront pas convertis. Il en va de même pour (GNU) tr - les deux applications sont sujettes à des modifications d’entrée dans des paramètres régionaux autres que le langage C. iconvpeut être combiné avec soit pour une solution complète.

Le rapport d'état par défaut de la 2>/dev/nullredirection dd, ainsi que son stderr. Sans cela dd, il s'ensuivrait l'achèvement d'un travail comme celui décrit ci-dessus avec des informations d'impression telles que le nombre d'octets traités, etc.


Cette solution est bien plus rapide que trlors du traitement de gros fichiers, merci!
— WhiteWinterWolf

13

Vous pouvez également utiliser Perl 5:

perl -pe '$_=lc' temp

L'option -pindique à perl d'exécuter l'expression spécifiée une fois pour chaque ligne d'entrée en imprimant le résultat, c'est-à-dire la valeur finale de $_. -eindique que le programme sera le prochain argument, par opposition à un fichier contenant le script. lcconvertit en minuscule. Sans argument, cela fonctionnera $_. Et $_=enregistre cela à nouveau pour qu'il soit imprimé.

Une variante de ce serait

perl -ne 'print lc' temp

Utiliser, -nc'est comme -psauf que ça $_ne sera pas imprimé à la fin. Ainsi, au lieu d’enregistrer dans cette variable, j’inclue une instruction print explicite.

Un avantage de Perl par rapport à sed est que vous n’avez pas besoin d’extensions GNU. Il existe des projets qui doivent être compatibles avec les environnements non-GNU mais qui ont également déjà une dépendance à Perl. Comparé à tr, il se peut que Perl lcsoit plus facilement compatible avec les paramètres régionaux. Voir la perllocalepage de manuel pour plus de détails.


9

Vous devez capturer le modèle correspondant, puis l'utiliser dans le remplacement avec un modificateur:

sed 's/\([A-Z]\)/\L\1/g' temp

Les \(...\)"captures" du texte correspondant englobant, la première capture passe à \1, les suivantes \2, etc. La numérotation est basée sur l'ouverture des crochets dans le cas de captures imbriquées.

Le \Lconvertit le motif capturé en minuscule, il y a aussi \Upour les majuscules.


3
vous n'avez pas besoin de faire cela - tout le schéma est toujours capturé&
— mikeserv

C'est vrai, mais j'aurais alors manqué l'occasion d'expliquer les matchs de capture :-)
— wurtel

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.