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?

JigarGandhi
la source

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
Anthon
la source
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é.

TankorSmash
la source
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.

Mikeserv
la source
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.

MvG
la source
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.

Wurtel
la source
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