sed one-liner para convertir todo en mayúsculas a minúsculas?

131

Tengo un archivo de texto en el que algunas palabras están impresas en TODAS LAS MAYÚSCULAS. Quiero poder convertir todo en el archivo de texto a minúsculas, usando sed. Eso significa que la primera oración se leería: "Tengo un archivo de texto en el que algunas palabras están impresas en mayúsculas".

magnetar
fuente
66
¿Conoces el trcomando? A veces es más adecuado que sed.
Bryan Oakley
@Bryan Oakley No estaba hasta ahora. Gracias por mencionarlo. Pero, ¿cómo lo uso para hacer lo que estaba pidiendo?
magnetar
mira en el enlace provisto en la respuesta de Raghuram.
Bryan Oakley
1
si debe usar sed, cat <input> | sed 'y / ABCDEFÑØÅÆŒ / abcdefñøåæœ /' <- Debe detallar todos los caracteres, de mayúsculas a minúsculas. Sé que es engorroso escribir todos esos caracteres, pero también funcionará con todos esos caracteres especiales internacionales. :)
Arno Teigseth

Respuestas:

248

Con 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

Funciona con GNU sed(BSD sedno es compatible \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
magnetar
fuente
66
Tuve que elegir mi propia respuesta porque no soy fanático de las respuestas que solo consisten en enlaces.
magnetar
66
OSX tampoco admite las extensiones GNU :(
ekkis
2
sed -e 's/.*/\L&/' input.txt > output.txtpara GNU sed funciona bien también
Asfand Qazi
1
@ekkis OSX está utilizando BSD (como se mencionó, BSD sed no lo admite). Intente leer la línea superior de man sedpara saber qué versión está utilizando.
Ryder
Por alguna razón, cuando uso su patrón de mayúsculas, agrega un Ufrente a cada línea
Xtremefaith
51

Si tiene extensiones GNU, puede usar sed's \ L (coincidencia completa inferior, o hasta que se alcance \ L [inferior] o \ E [final - alternar la carcasa]), así:

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

Nota: '&' significa el patrón de coincidencia completo.

Como nota al margen, las extensiones GNU incluyen \ U (superior), \ u (siguiente carácter superior de coincidencia), \ l (siguiente carácter inferior de coincidencia). Por ejemplo, si quisieras hacer una frase en camello:

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

Nota: Dado que se supone que tenemos extensiones GNU, también podemos usar la opción dash-r (expresiones regulares extendidas), que permite \ w (carácter de palabra) y lo libera de tener que escapar del paréntesis de captura y uno o más cuantificador (+). (Aparte: \W [non-word], \s [whitespace], \S [non-whitespace]también son compatibles con dash-r, pero \d [digit]y \D [non-digit]no lo son).

Luv2code
fuente
1
Consejo muy útil. Descubrí que los paréntesis redondos no son necesarios en el ejemplo de camello. 's / \ w + / \ u & / g' también funciona.
PJ_Finnegan
1
sed -ri 's/MATCH_WHATEVER/\L&/i' input-file.ext- el uso del /imodificador hace que el partido no distinga entre mayúsculas y minúsculas y, por lo tanto, es opcional. El -iinterruptor le dice a sed que modifique el archivo en el lugar. No es necesario redirigir la salida a otro archivo si no es necesario.
Jim
1
Realmente necesitaba esto \E [end - toggle casing off]. Gracias !
Mehdi Yedes
37

También puede hacerlo fácilmente con awk, si está dispuesto a considerar una herramienta diferente:

echo "UPPER" | awk '{print tolower($0)}'
whitehat237
fuente
1
Su mejor respuesta, porque trabaja con cirílico. tr: - no funcionó con eso.
Amaroc
2
Cuidado con los personajes con acentos. tolowerno podrá manejar Àpor ejemplo
Sam Houston
Puede cambiar el nombre de un grupo de archivos con ese comando: ls | awk '{print "mv " $0 " " tolower($0)}' | sh
Neekobus
15

Aquí hay muchas soluciones:

Para sobresalir con perl, tr, sed y 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 minúsculas con perl, tr, sed y 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)}'

Complicado bash a minúsculas:

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

Complicado golpe a mayúscula:

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 a minúsculas:

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

Golpe simple a mayúscula:

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

Tenga en cuenta que $ {v,} y $ {v ^} solo cambian la primera letra.

Deberías usarlo de esa manera:

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

Salida:

hola mi nombre es sujit
Sujit Dhamale
fuente
5

Me gustan algunas de las respuestas aquí, pero hay un comando sed que debería funcionar en cualquier plataforma:

sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'

De todos modos, es fácil de entender. Y conocer el comando y puede ser útil a veces.

Dennis
fuente
2
Esto no funciona para caracteres internacionales arbitrarios pero funciona para caracteres ASCII en OS / X
emrys57
Ciertamente hizo el trabajo por mí. Tengo que admitir que fue la primera vez que usé mi comando. ¡Gracias!
monsune
4

Si está utilizando posix sed

Selección para cualquier caso para un patrón (convertir el patrón buscado con este sed que usar el patrón convertido en el comando deseado usando 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 minúsculas

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"

lo mismo para mayúsculas reemplazar letra minúscula entre // por equivalente superior en el sed

Que te diviertas

NeronLeVelu
fuente
(Encontré que este funcionó mejor en MacOS) - Bien, amigo mío, pero una pequeña topografía - tienes el caso Jj al revés. Debe ser 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 / [aY] / y / g; s / [zZ] / z / g "
Neil McGill
No estoy seguro de por qué necesita hacer algo tan laborioso. Supongo que Mac OS no tiene extensiones GNU, pero si está configurado para usar sed, en lugar de la sustitución ('s'), podría usar la transliteración ('y') de esta manera: sed 'y / ABCDEFGHIJKLMNOPQRSTUVWXYZ / abcdefghijklmnopqrstuvwxyz / '
Luv2code
el objetivo era seleccionar cualquier patrón de texto que parezca una minúscula / mayúscula de un sedimento que no sea GNU sin cambiar el contenido de la fuente de datos (un y//cambio en el contenido de la fuente o podría perder la búsqueda del patrón.
NeronLeVelu
3

corto, dulce y ni siquiera necesitas redireccionar :-)

perl -p -i -e 'tr/A-Z/a-z/' file
pedrito
fuente
Ja, bueno, intenté usar esto con una mirada hacia atrás y de alguna manera reemplazó la mayoría de las letras en mis archivos con otras letras mayúsculas al azar. Me dio una buena risa de todos modos. Pude obtener lo que quería de esta respuesta también sobre perl: askubuntu.com/a/527073/250556
ThorSummoner