J'ai un temp
fichier avec des contenus minuscules et majuscules.
Contribution
Contenu de mon temp
dossier:
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:
Si votre entrée ne contient que des caractères ASCII, vous pouvez utiliser le
tr
type suivant: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):si vous devez utiliser
sed
:(supposons ici la mise en oeuvre de GNU).
Avec POSIX
sed
, vous devez spécifier toutes les translittérations, puis choisir les lettres à convertir:Avec
awk
:la source
\L
s'agit d'une extension GNU.\L
fonctionne bien pour moi jusqu'à présent. En clair le point que vous essayez de faire l' extension GNUsed
est 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.\L
n'est pas parmi eux et a été introduit par GNUsed
(correspond au même opérateur dans standardex
/vi
) et n'est généralement pas disponible dans d'autres implémentations.tr
implémentations telles que GNUtr
ne fonctionnent pas correctement dans les paramètres régionaux multi-octets (la plupart d’entre elles le sont actuellement, essayezecho STÉPHANE | tr '[:upper:]' '[:lower:]'
par exemple). Sur les systèmes GNU, vous pouvez préférer lased
variante ouawk
« stolower()
.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 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éAvec vim, c'est super simple:
Ouvre le fichier,
gg
va à la première ligne0
, première colonne. AvecguG
, réduit 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; ç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
u
par unU
:gg0gUGZZ
et le tour est joué.la source
vim file1 file2 fileetc
et quelque chose comme:bufdo gg0guG:w<CR>
cela fonctionnerait probablement pour un nombre quelconque de fichiers. Je n'ai pas testé ça!J'aime
dd
pour ça moi-même.... obtient ...
Le
LC_ALL=C
est 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.iconv
peut être combiné avec soit pour une solution complète.Le rapport d'état par défaut de la
2>/dev/null
redirectiondd
, ainsi que son stderr. Sans celadd
, 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.la source
tr
lors du traitement de gros fichiers, merci!Vous pouvez également utiliser Perl 5:
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 minuscule. Sans argument, cela fonctionnera$_
. Et$_=
enregistre cela à nouveau pour qu'il soit imprimé.Une variante de ce serait
Utiliser,
-n
c'est comme-p
sauf 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 Perllc
soit plus facilement compatible avec les paramètres régionaux. Voir laperllocale
page de manuel pour plus de détails.la source
Vous devez capturer le modèle correspondant, puis l'utiliser dans le remplacement avec un modificateur:
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
\L
convertit le motif capturé en minuscule, il y a aussi\U
pour les majuscules.la source
&
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 du shell ($ _ étant un paramètre Bash spécial; voir: https://www.gnu.org/software/bash/manual/ html_node / Special-Parameters.html )
la source