web-dev-qa-db-fra.com

Un one-liner pour convertir toutes les majuscules en minuscules?

J'ai un fichier texte dans lequel certains mots sont imprimés en majuscule. Je veux pouvoir tout convertir dans le fichier texte en minuscule, en utilisant sed. Cela signifie que la première phrase se lirait comme suit: "J'ai un fichier texte dans lequel certains mots sont imprimés en majuscules".

109
magnetar

Avec tr:

# Converts upper to lower case 
$ tr '[:upper:]' '[:lower:]' < input.txt > output.txt

# Converts lower to upper case
$ tr '[:lower:]' '[:upper:]' < input.txt > output.txt

Fonctionne avec GNU sed (BSD sed ne supporte pas \L\U):

# Converts upper to lower case
$ sed -e 's/\(.*\)/\L\1/' input.txt > output.txt

# Converts lower to upper case
$ sed -e 's/\(.*\)/\U\1/' input.txt > output.txt
206
magnetar

Si vous avez les extensions GNU, vous pouvez utiliser\L (correspondance complète inférieure, ou jusqu'à ce que\L [inférieur] ou\E [fin - basculement du boîtier] soit atteint)), comme suit:

sed 's/.*/\L&/' <input >output

Remarque: '&' signifie le modèle de correspondance complet.

En remarque, GNU incluent\U (supérieur),\u (caractère suivant supérieur de la correspondance),\l (caractère inférieur suivant de la correspondance). Par exemple, si vous souhaitez camelcase une phrase:

$ sed -r 's/\w+/\u&/g' <<< "Now is the time for all good men..." # Camel Case
Now Is The Time For All Good Men...

Note: Puisque l’hypothèse est que nous avons des extensions GNU, nous pouvons également utiliser l’option dash-r (expressions régulières étendues), qui autorise\w (caractère Word) et vous évite d’échapper la parenthèse de capture et le ou les quantificateurs (+) (en plus: \W [non-Word], \s [whitespace], \S [non-whitespace] sont également pris en charge avec dash-r, mais \d [digit] et \D [non-digit] ne sont pas.)

40
Luv2code

Vous pouvez également le faire très facilement avec awk, si vous êtes prêt à envisager un autre outil:

echo "UPPER" | awk '{print tolower($0)}'
30
whitehat237

Voici plusieurs solutions:

Faire un upercaser avec Perl, tr, sed et awk

Perl -ne 'print uc'
Perl -npe '$_=uc'
Perl -npe 'tr/[a-z]/[A-Z]/'
Perl -npe 'tr/a-z/A-Z/'
tr '[a-z]' '[A-Z]'
sed y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
sed 's/\([a-z]\)/\U\1/g'
sed 's/.*/\U&/'
awk '{print toupper($0)}'

En minuscule avec Perl, tr, sed et awk

Perl -ne 'print lc'
Perl -npe '$_=lc'
Perl -npe 'tr/[A-Z]/[a-z]/'
Perl -npe 'tr/A-Z/a-z/'
tr '[A-Z]' '[a-z]'
sed y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
sed 's/\([A-Z]\)/\L\1/g'
sed 's/.*/\L&/'
awk '{print tolower($0)}'

Bash compliqué en minuscule:

while read v;do v=${v//A/a};v=${v//B/b};v=${v//C/c};v=${v//D/d};v=${v//E/e};v=${v//F/f};v=${v//G/g};v=${v//H/h};v=${v//I/i};v=${v//J/j};v=${v//K/k};v=${v//L/l};v=${v//M/m};v=${v//N/n};v=${v//O/o};v=${v//P/p};v=${v//Q/q};v=${v//R/r};v=${v//S/s};v=${v//T/t};v=${v//U/u};v=${v//V/v};v=${v//W/w};v=${v//X/x};v=${v//Y/y};v=${v//Z/z};echo "$v";done

Bash compliqué à majuscule:

while read v;do v=${v//a/A};v=${v//b/B};v=${v//c/C};v=${v//d/D};v=${v//e/E};v=${v//f/F};v=${v//g/G};v=${v//h/H};v=${v//i/I};v=${v//j/J};v=${v//k/K};v=${v//l/L};v=${v//m/M};v=${v//n/N};v=${v//o/O};v=${v//p/P};v=${v//q/Q};v=${v//r/R};v=${v//s/S};v=${v//t/T};v=${v//u/U};v=${v//v/V};v=${v//w/W};v=${v//x/X};v=${v//y/Y};v=${v//z/Z};echo "$v";done

Simple bash en minuscule:

while read v;do echo "${v,,}"; done

Simple bash en majuscule:

while read v;do echo "${v^^}"; done

Notez que $ {v,} et $ {v ^} ne modifient que la première lettre.

Vous devriez l'utiliser de cette façon:

(while read v;do echo "${v,,}"; done) < input_file.txt > output_file.txt
11
Vouze
echo  "Hello  MY name is SUJIT "  | sed 's/./\L&/g'

Sortie:

 bonjour mon nom est sujit 
6
Sujit Dhamale

Si vous utilisez posix sed

Sélection pour n'importe quel cas pour un motif (convertir le motif recherché avec ce sed puis utiliser le motif converti dans la commande que vous vouliez en utilisant regex:

echo "${MyOrgPattern} | sed "s/[aA]/[aA]/g;s/[bB]/[bB]/g;s/[cC]/[cC]/g;s/[dD]/[dD]/g;s/[eE]/[eE]/g;s/[fF]/[fF]/g;s/[gG]/[gG]/g;s/[hH]/[hH]/g;s/[iI]/[iI]/g;s/[jJ]/[jJ]/g;s/[kK]/[kK]/g;s/[lL]/[lL]/g;s/[mM]/[mM]/g;s/[nN]/[nN]/g;s/[oO]/[oO]/g;s/[pP]/[pP]/g;s/[qQ]/[qQ]/g;s/[rR]/[rR]/g;s/[sS]/[sS]/g;s/[tT]/[tT]/g;s/[uU]/[uU]/g;s/[vV]/[vV]/g;s/[wW]/[wW]/g;s/[xX]/[xX]/g;s/[yY]/[yY]/g;s/[zZ]/[zZ]/g" | read -c MyNewPattern
 YourInputStreamCommand | egrep "${MyNewPattern}"

convertir en minuscule

sed "s/[aA]/a/g;s/[bB]/b/g;s/[cC]/c/g;s/[dD]/d/g;s/[eE]/e/g;s/[fF]/f/g;s/[gG]/g/g;s/[hH]/h/g;s/[iI]/i/g;s/j/[jJ]/g;s/[kK]/k/g;s/[lL]/l/g;s/[mM]/m/g;s/[nN]/n/g;s/[oO]/o/g;s/[pP]/p/g;s/[qQ]/q/g;s/[rR]/r/g;s/[sS]/s/g;s/[tT]/t/g;s/[uU]/u/g;s/[vV]/v/g;s/[wW]/w/g;s/[xX]/x/g;s/[yY]/y/g;s/[zZ]/z/g"

idem pour les majuscules, remplacer la lettre inférieure entre // par son équivalent supérieur dans le sed

S'amuser

4
NeronLeVelu

J'aime certaines des réponses ici, mais il y a une commande sed qui devrait faire l'affaire sur n'importe quelle plate-forme:

sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'

De toute façon, c'est facile à comprendre. Et connaître la commande y peut être utile parfois.

3
Dennis

bref, doux et vous n'avez même pas besoin de redirection :-)

Perl -p -i -e 'tr/A-Z/a-z/' file
3
pedrito