web-dev-qa-db-fra.com

Convertir le contenu du fichier en minuscules

J'ai un fichier temp avec du contenu en minuscules et en majuscules.

Contribution

Contenu de mon fichier temp:

hi
Jigar
GANDHI
jiga

Je veux tout convertir du haut vers le bas.

Commander

J'ai essayé la commande suivante:

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

mais a obtenu une mauvaise sortie.

Production

Je le veux comme:

hi
jigar
gandhi
jiga

Que doit contenir la partie substitut de l'argument pour sed?

91
JigarGandhi

Si votre entrée ne contient que ASCII caractères, vous pouvez utiliser tr comme:

tr A-Z a-z < input 

ou (moins facile à retenir et à taper IMO; mais sans s'y limiter ASCII lettres latines, 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é à ASCII lettres):

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

si vous devez utiliser sed:

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

(ici en supposant l'implémentation GNU).

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

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

Avec awk:

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

Avec vim, c'est super simple:

$ vim filename
gg0guGZZ

Ouvre le fichier, gg va à la première ligne, 0, première colonne. Avec guG, abaisse la casse de tous les caractères jusqu'au bas du fichier. ZZ enregistre et quitte.

Il devrait gérer à peu près tout ce que vous lui lancez; il ignorera les nombres, il gèrera non ASCII.

Si vous voulez faire le contraire, transformez les lettres minuscules en majuscules, échangez le u pour un U: gg0gUGZZ et vous êtes prêt.

30
TankorSmash

J'aime dd pour cela, 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=C sert à protéger tous les multioctets en entrée - bien que les majuscules à plusieurs octets ne soient pas converties. La même chose est vraie pour (GNU)tr - les deux applications sont sujettes à la manipulation d'entrée dans n'importe quel environnement local non-C. iconv peut être combiné avec l'un ou l'autre pour une solution complète.

Le 2>/dev/null redirige les rejets dd le rapport d'état par défaut - et son stderr. Sans cela, dd suivrait l'achèvement d'un travail comme les informations ci-dessus avec les informations d'impression comme le nombre d'octets traités, etc.

18
mikeserv

Vous pouvez également utiliser Perl 5:

Perl -pe '$_=lc' temp

L'option -p indique à 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 $_. -e indique que le programme sera le prochain argument, par opposition à un fichier contenant le script. lc convertit en minuscules. Sans argument, il fonctionnera sur $_. Et $_= l'enregistre à nouveau pour qu'il soit imprimé.

Une variation de ce serait

Perl -ne 'print lc' temp

En utilisant -n est comme -p excepté $_ ne sera pas imprimé à la fin. Donc, au lieu d'enregistrer dans cette variable, j'inclus une instruction d'impression explicite.

Un avantage de Perl contrairement à sed est que vous n'avez besoin d'aucune extension GNU. Il existe des projets qui doivent être compatibles avec des environnements non GNU mais qui ont également déjà une dépendance Perl asa. Par rapport à tr, il est possible que Perl lc soit plus facilement accessible aux paramètres régionaux. Consultez la page de manuel perllocale pour plus de détails.

13
MvG

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

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

La \(...\) "capture" le texte correspondant joint, la première capture va à \1, La suivante à \2, Etc. La numérotation est en fonction des crochets d'ouverture en cas de captures imbriquées.

Le \L Convertit le motif capturé en minuscules, il y a aussi \U Pour les majuscules.

9
wurtel

Suite à la réponse de MvG, vous pouvez également utiliser Perl 6:

Perl6 -pe .=lc temp

Ici $ _ est implicite, et vous n'avez pas besoin des guillemets simples pour le protéger de l'expansion par le Shell ($ _ étant un paramètre spécial de Bash; voir: https://www.gnu.org/software/ bash/manual/html_node/Special-Parameters.html )

1
ozzy