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
\L
est une extension GNU. -
\L
fonctionne bien pour moi jusquà présent. Sachez que vous essayez de créer une extension GNU - @JigarGandhi.
sed
est 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.\L
nen 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
tr
comme GNUtr
don ‘ 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 variantesed
ouawk
‘ stolower()
. - Légère correction:
sed 's/.*/\L&/g' < input
. La\1
ré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 fileetc
et 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
tr
lors 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 )