J'ai un fichier temp
avec du contenu en minuscules et en majuscules.
Contenu de mon fichier temp
:
hi
Jigar
GANDHI
jiga
Je veux tout convertir du haut vers le bas.
J'ai essayé la commande suivante:
sed -e "s/[A-Z]/[a-z]/g" temp
mais a obtenu une mauvaise sortie.
Je le veux comme:
hi
jigar
gandhi
jiga
Que doit contenir la partie substitut de l'argument pour sed
?
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
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.
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.
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.
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.
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 )