Jai un fichier temp avec un contenu en minuscules et en majuscules.
Entrée
Contenu de mon fichier temp:
hi Jigar GANDHI jiga
Je souhaite convertir tout supérieur en inférieur .
Commande
Jai essayé la commande suivante:
sed -e "s/[A-Z]/[a-z]/g" temp
mais jai obtenu une mauvaise sortie.
Sortie
Je le veux comme:
hi jigar gandhi jiga
Ce qui doit être dans la partie substitut de largument pour sed?
Commentaires
- Voir aussi Comment convertir des fichiers txt UTF-8 en toutes les majuscules en bash?
Réponse
Si votre entrée ne contient que des caractères ASCII, vous pouvez utiliser tr comme:
ou (moins facile à retenir et à taper IMO; mais pas limité 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
(ici en supposant limplémentation GNU).
Avec POSIX sed, vous « auriez besoin de spécifier toutes les translittérations et ensuite vous pourrez choisir lesquelles lettres à convertir:
sed "y/AǼBCΓDEFGH.../aǽbcγdefgh.../" < input
Avec awk:
awk "{print tolower($0)}" < input
Commentaires
- Veuillez noter que
\Lest une extension GNU. -
\Lfonctionne bien pour moi jusquà présent. Sachez que vous essayez de créer une extension GNU - @JigarGandhi.
sedest une commande Unix. Différents systèmes ont différentes variantes avec un comportement différent d fonctionnalité. Heureusement, de nos jours, il existe ‘ une norme à laquelle la plupart sont conformes afin que vous puissiez compter sur un ensemble minimum de fonctionnalités communes à tous.\Lnen fait pas partie et a été introduit par GNUsed(correspond au même opérateur dans la normeex/vi) et nest généralement pas disponible dans dautres implémentations. - Notez que certaines implémentations
trcomme GNUtrdon ‘ t fonctionne correctement dans les paramètres régionaux multi-octets (la plupart sont de nos jours, essayezecho STÉPHANE | tr '[:upper:]' '[:lower:]'par exemple). Sur les systèmes GNU, vous pouvez préférer la variantesedouawk‘ stolower(). - Légère correction:
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 entre parenthèses comme le fait wurtle dans la sienne. Cependant, il est ‘ légèrement plus propre dutiliser&pour représenter la correspondance entière, comme indiqué
Réponse
En utilisant vim, cest super simple:
$ vim filename gg0guGZZ
Ouvre le fichier, gg va à la première ligne, 0, première colonne. Avec guG , réduit la casse de tous les caractères jusquau bas du fichier. ZZ enregistre et quitte.
Il devrait gérer à peu près tout ce que vous lui lancez; il « ll ignorera les nombres, il » traitera les nombres non ASCII.
Si vous vouliez faire le contraire, mettez les lettres minuscules en majuscules, permutez les u pour un U: gg0gUGZZ et vous « êtes prêt.
Commentaires
- Lol » super simple »
- cela ne fait évidemment pas ‘ t bien dimensionner pour de nombreux fichiers
- @CoreyGoldberg
vim file1 file2 fileetcet quelque chose comme:bufdo gg0guG:w<CR>serait probablement fonctionne pour nimporte quel nombre de fichiers. Je nai pas testé cela cependant! - @TankorSmash qui ne ‘ t pas encore mis à léchelle à un grand nombre de fichiers
Réponse
Jaime 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 est de protéger tous les multi-octets en entrée – bien que les majuscules multi-octets ne soient pas converties. La même chose est vraie pour (GNU) tr – les deux applications sont susceptibles de modifier les entrées dans nimporte quelle locale non-C. iconv peut être combiné avec lun ou lautre pour une solution complète.
La redirection 2>/dev/null rejette le rapport détat par défaut de dd « – et son stderr. Sans lui dd suivrait lachèvement dun travail comme ci-dessus avec des informations dimpression telles que le nombre doctets traités, etc.
Commentaires
- Cette solution est bien plus rapide que
trlors du traitement de gros fichiers, merci!
Réponse
Vous pouvez également utiliser Perl 5:
perl -pe "$_=lc" temp
Loption -p indique perl pour exécuter lexpression spécifiée une fois pour chaque ligne dentrée, en imprimant le résultat, cest-à-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 $_= lenregistre à nouveau pour quil soit imprimé.
Une variante de cela serait
perl -ne "print lc" temp
Utilisation de -n est comme -p sauf que $_ ne sera « pas imprimé à la fin. Donc au lieu de sauvegarder dans cette variable, jinclus une instruction dimpression explicite.
Un avantage de Perl par rapport à sed est que vous navez pas besoin dextensions GNU. Il y a des projets qui doivent être compatibles avec des environnements non-GNU mais qui ont aussi déjà une dépendance Perl. Par rapport à tr, il se peut que Perl lc soit plus facilement sensible aux paramètres régionaux. Consultez la page de manuel perllocale pour plus de détails.
Réponse
Vous devez capturer le motif correspondant, puis utilisez-le dans le remplacement avec un modificateur:
sed "s/\([A-Z]\)/\L\1/g" temp
Le \(...\) « capture » le englobant le texte correspondant, la première capture va à \1, la suivante à \2, etc. La numérotation se fait selon les crochets ouvrants en cas de captures imbriquées.
Le \L convertit le motif capturé en minuscules, il ya aussi \U pour les majuscules .
Commentaires
- vous n’avez pas besoin de faire cela – le motif entier est toujours pris dans
& - Cest vrai, mais jaurais raté loccasion dexpliquer la capture des correspondances 🙂
Réponse
Suite à la réponse de MvG », vous pouvez également utiliser Perl 6:
perl6 -pe .=lc temp
Ici $ _ est implicite, et vous navez pas besoin des guillemets simples pour le protéger de lexpansion par le shell ($ _ étant un paramètre spécial de Bash; voir: https://www.gnu.org/software/bash/manual/html_node/Special-Parameters.html )