Convierta el contenido del archivo a minúsculas

85

Tengo un temparchivo con algunos contenidos en minúsculas y mayúsculas.

Entrada

Contenido de mi temparchivo:

hi
Jigar
GANDHI
jiga

Quiero convertir todo de arriba a abajo .

Mando

Intenté el siguiente comando:

sed -e "s/[A-Z]/[a-z]/g" temp

pero obtuvo un resultado incorrecto.

Salida

Lo quiero como:

hi
jigar
gandhi
jiga

¿Para qué debe estar la parte sustituta del argumento sed?

JigarGandhi
fuente

Respuestas:

122

Si su entrada solo contiene caracteres ASCII, puede usar trcomo:

tr A-Z a-z < input 

o (menos fácil de recordar y escribir IMO; pero no se limita a las letras latinas ASCII, aunque en algunas implementaciones que incluyen GNU tr, todavía se limita a caracteres de un solo byte, por lo que en las configuraciones regionales UTF-8, todavía se limita a letras ASCII):

tr '[:upper:]' '[:lower:]' < input

si tienes que usar sed:

sed 's/.*/\L&/g' < input

(aquí asumiendo la implementación de GNU).

Con POSIX sed, necesitará especificar todas las transliteraciones y luego puede elegir qué letras desea convertir:

sed 'y/AǼBCΓDEFGH.../aǽbcγdefgh.../' < input

Con awk:

awk '{print tolower($0)}' < input
Anthon
fuente
3
Tenga en cuenta que \Les una extensión GNU.
Anthon
\LFunciona bien para mí hasta ahora. Para aclarar el punto que está tratando de hacer la extensión GNU
JigarGandhi 05 de
2
@JigarGandhi. sedEs un comando de Unix. Los diferentes sistemas tienen diferentes variantes con diferentes comportamientos y funcionalidades. Afortunadamente, hoy en día, hay un estándar que se ajusta a la mayoría para que pueda contar con un conjunto mínimo de características comunes a todos. \Lno está entre ellos y fue introducido por GNU sed(coincide con el mismo operador en estándar ex/ vi) y generalmente no está disponible en otras implementaciones.
Stéphane Chazelas
99
Tenga en cuenta que algunas trimplementaciones como GNU trno funcionan correctamente en entornos locales de varios bytes (la mayoría de ellas lo son hoy en día, echo STÉPHANE | tr '[:upper:]' '[:lower:]'por ejemplo). En los sistemas GNU, puede preferir la sedvariante o awk's tolower().
Stéphane Chazelas
55
Corrección ligera: sed 's/.*/\L&/g' < input. La \1referencia a la subcadena coincidente no funcionará a menos que especifique la subcadena con paréntesis como lo hace wurtle en la suya. Sin embargo, es un poco más limpio de usar &para representar todo el partido, como se muestra
Edward Brown el
30

Usando vim, es súper simple:

$ vim filename
gg0guGZZ

Abre el archivo, ggva a la primera línea 0, primera columna. Con guG, reduce el caso de todos los caracteres hasta el final del archivo. ZZsalva y sale.

Debería manejar casi cualquier cosa que le arrojes; Ignorará los números, manejará no ASCII.

Si desea hacer lo contrario, convierta las letras minúsculas en mayúsculas, cambie la usalida por U: gg0gUGZZy listo.

TankorSmash
fuente
14
Lol "super simple"
blambert
esto obviamente no escala bien para muchos archivos
Corey Goldberg
mi respuesta favorita hasta ahora !!!!
Mona Jalal
1
@CoreyGoldberg vim file1 file2 fileetcy luego algo así :bufdo gg0guG:w<CR>sería probablemente funcionará para cualquier número de archivos. Sin embargo, no he probado eso!
TankorSmash
@TankorSmash que todavía no escala a una gran cantidad de archivos
Corey Goldberg
17

Me gusta ddpara esto, yo mismo.

<<\IN LC_ALL=C 2<>/dev/null \
dd conv=lcase
hi
Jigar 
GANDHI
jiga
IN

... consigue ...

hi
jigar
ghandi
jiga

El LC_ALL=Cobjetivo es proteger cualquier multibytes en la entrada, aunque no se convertirán las mayúsculas multibyte. Lo mismo es cierto para (GNU) tr : ambas aplicaciones son propensas a la manipulación de entradas en cualquier configuración regional que no sea C. iconvse puede combinar con cualquiera de ellos para obtener una solución integral.

El 2>/dev/nullredireccionamiento descarta ddel informe de estado predeterminado del servidor y su stderr. Sin esto, ddse completaría un trabajo como el anterior con información de impresión, como cuántos bytes se procesaron, etc.

mikeserv
fuente
Esta solución es mucho más rápida que trcuando se manejan archivos grandes, ¡gracias!
WhiteWinterWolf
13

También puedes usar Perl 5:

perl -pe '$_=lc' temp

La opción -ple dice a Perl que ejecute la expresión especificada una vez para cada línea de entrada, imprimiendo el resultado, es decir, el valor final de $_. -eindica que el programa será el siguiente argumento, a diferencia de un archivo que contiene el script. lcConvierte a minúsculas. Sin una discusión, seguirá funcionando $_. Y lo $_=guarda de nuevo para que se imprima.

Una variación de eso sería

perl -ne 'print lc' temp

El uso -nes como, -pexcepto que al $_final no se imprimirá. Entonces, en lugar de guardar en esa variable, incluyo una declaración de impresión explícita.

Un beneficio de Perl en contraste con sed es que no necesita ninguna extensión GNU. Hay proyectos que tienen que ser compatibles con entornos que no sean GNU pero que también tienen dependencia de Perl. En comparación con esto tr, podría ser que Perl lcpueda ser más fácil de reconocer en la localidad. Vea la perllocalepágina del manual para más detalles.

MvG
fuente
9

Debe capturar el patrón coincidente y luego usarlo en el reemplazo con un modificador:

sed 's/\([A-Z]\)/\L\1/g' temp

Las \(...\)"capturas" del texto coincidente adjunto, la primera captura va \1, la siguiente \2, etc. La numeración se corresponde con los corchetes de apertura en caso de capturas anidadas.

El \Lconvierte el patrón capturado a minúsculas, hay también \Upara el caso superior.

wurtel
fuente
3
ya no tienes que hacer esto - todo el patrón está siempre atrapado en&
mikeserv
Es cierto, pero habría perdido la oportunidad de explicar la captura de partidos :-)
wurtel