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

131

J'ai un fichier texte dans lequel certains mots sont imprimés en MAJUSCULES. Je veux pouvoir simplement convertir tout dans le fichier texte en minuscules, en utilisant sed. Cela signifie que la première phrase se lirait alors: «J'ai un fichier texte dans lequel certains mots sont imprimés en majuscules».

magnétar
la source
6
êtes-vous au courant de la trcommande? Parfois, c'est plus approprié que sed.
Bryan Oakley du
@Bryan Oakley Je ne l'étais pas jusqu'à présent. Merci de l'avoir signalé. Mais comment l'utiliser pour faire ce que je demandais?
magnetar
regardez dans le lien fourni dans la réponse de Raghuram.
Bryan Oakley
1
si vous devez utiliser sed, cat <input> | sed 'y / ABCDEFÑØÅÆŒ / abcdefñøåæœ /' <- Vous devez détailler tous les caractères, des majuscules aux minuscules. Je sais que c'est compliqué d'écrire tous ces caractères, mais cela fonctionnera également avec tous ces caractères spéciaux internationaux. :)
Arno Teigseth

Réponses:

248

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 sedne prend pas en charge \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
magnétar
la source
6
J'ai dû choisir ma propre réponse car je ne suis pas fan des réponses qui consistent simplement en des liens.
magnetar
6
OSX ne prend pas en charge les extensions GNU non plus :(
ekkis
2
sed -e 's/.*/\L&/' input.txt > output.txtpour GNU sed fonctionne bien aussi
Asfand Qazi
1
@ekkis OSX utilise BSD (comme mentionné, BSD sed ne le prend pas en charge). Essayez de lire la première ligne de man sedpour savoir quelle version vous utilisez.
Ryder
Pour une raison quelconque, lorsque j'utilise votre modèle en majuscules, il ajoute un Udevant chaque ligne
Xtremefaith
51

Si vous avez des extensions GNU, vous pouvez utiliser \ L de sed (correspondance entière inférieure, ou jusqu'à ce que \ L [lower] ou \ E [end - toggle casing off] soit atteint), comme ceci:

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

Remarque: «&» signifie le modèle de correspondance complet.

En remarque, les extensions GNU incluent \ U (supérieur), \ u (caractère suivant supérieur de la correspondance), \ l (caractère suivant inférieur de la correspondance). Par exemple, si vous vouliez 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...

Remarque: 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 de mot) et vous évite d'avoir à échapper la parenthèse de capture et un ou plusieurs quantificateur (+). (À part: \W [non-word], \s [whitespace], \S [non-whitespace]sont également pris en charge avec dash-r, mais \d [digit]et \D [non-digit]ne le sont pas.)

Luv2code
la source
1
Astuce très utile. J'ai trouvé que les parenthèses rondes ne sont pas nécessaires dans l'exemple du cas du chameau. 's / \ w + / \ u & / g' fonctionne également.
PJ_Finnegan
1
sed -ri 's/MATCH_WHATEVER/\L&/i' input-file.ext- l'utilisation du /imodificateur rend la correspondance insensible à la casse et est donc facultative. Le -icommutateur indique à sed de modifier le fichier sur place. Pas besoin de rediriger la sortie vers un autre fichier si vous n'êtes pas obligé de le faire.
Jim
1
J'avais vraiment besoin de ça \E [end - toggle casing off]. Je vous remercie !
Mehdi Yedes le
37

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

echo "UPPER" | awk '{print tolower($0)}'
whitehat237
la source
1
Sa meilleure réponse est de travailler avec cyrillique. tr: - n'a pas fonctionné avec.
Amaroc
2
Attention aux personnages avec des accents. tolowerne sera pas en mesure de gérer Àpar exemple
Sam Houston
Vous pouvez renommer un tas de fichiers avec cette commande: ls | awk '{print "mv " $0 " " tolower($0)}' | sh
Neekobus
15

Voici de nombreuses solutions:

Pour 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 minuscules 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 minuscules:

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é en majuscules:

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 simple en minuscules:

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

Bash simple en majuscules:

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
Vouze
la source
7
echo  "Hello  MY name is SUJIT "  | sed 's/./\L&/g'

Production:

bonjour mon nom est sujit
Sujit Dhamale
la source
5

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

sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'

Quoi qu'il en soit, c'est facile à comprendre. Et connaître la commande y peut parfois être utile.

Dennis
la source
2
Cela ne fonctionne pas pour les caractères internationaux arbitraires mais fonctionne pour les caractères ASCII dans OS / X
emrys57
Cela a certainement fait le travail pour moi. Je dois admettre que c'était la première fois que j'utilisais la commande y. Merci!
monsune le
4

Si vous utilisez posix sed

Sélection dans tous les cas pour un modèle (en convertissant le modèle recherché avec ce sed, utilisez le modèle converti dans la commande souhaitée 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 minuscules

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 l'équivalent supérieur dans le sed

S'amuser

NeronLeVelu
la source
(J'ai trouvé que celui-ci fonctionnait mieux sur MacOS) - Bien, mon ami - mais un petit topo - vous avez le boîtier Jj à l'envers. Doit être 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 / [jJ] / j / 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 "
Neil McGill
Je ne sais pas pourquoi vous devez faire quelque chose d'aussi laborieux. Je suppose que Mac OS n'a pas d'extensions GNU, mais si vous êtes déterminé à utiliser sed, au lieu de substitution ('s'), vous pouvez utiliser la translittération ('y') comme ceci: sed 'y / ABCDEFGHIJKLMNOPQRSTUVWXYZ / abcdefghijklmnopqrstuvwxyz / '
Luv2code
le but était de sélectionner n'importe quel modèle de texte qui ressemblait à une minuscule / majuscule à partir d'un sed non GNU sans changer le contenu de la source de données (un y//changement du contenu de la source ou pourrait manquer la recherche de modèle.
NeronLeVelu
3

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

perl -p -i -e 'tr/A-Z/a-z/' file
pedrito
la source
Hah, eh bien, j'ai essayé de l'utiliser avec un regard derrière et il a en quelque sorte remplacé la plupart de toutes les lettres de mes fichiers par d'autres lettres majuscules aléatoires. M'a fait rire quand même. J'ai pu aussi tirer ce que je voulais de cette réponse à propos de perl: askubuntu.com/a/527073/250556
ThorSummoner