Tengo un temp
archivo con algunos contenidos en minúsculas y mayúsculas.
Entrada
Contenido de mi temp
archivo:
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
?
Respuestas:
Si su entrada solo contiene caracteres ASCII, puede usar
tr
como: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):si tienes que usar
sed
:(aquí asumiendo la implementación de GNU).
Con POSIX
sed
, necesitará especificar todas las transliteraciones y luego puede elegir qué letras desea convertir:Con
awk
:fuente
\L
es una extensión GNU.\L
Funciona bien para mí hasta ahora. Para aclarar el punto que está tratando de hacer la extensión GNUsed
Es 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.\L
no está entre ellos y fue introducido por GNUsed
(coincide con el mismo operador en estándarex
/vi
) y generalmente no está disponible en otras implementaciones.tr
implementaciones como GNUtr
no 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 lased
variante oawk
'stolower()
.sed 's/.*/\L&/g' < input
. La\1
referencia 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 muestraUsando vim, es súper simple:
Abre el archivo,
gg
va a la primera línea0
, primera columna. ConguG
, reduce el caso de todos los caracteres hasta el final del archivo.ZZ
salva 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
u
salida porU
:gg0gUGZZ
y listo.fuente
vim file1 file2 fileetc
y luego algo así:bufdo gg0guG:w<CR>
sería probablemente funcionará para cualquier número de archivos. Sin embargo, no he probado eso!Me gusta
dd
para esto, yo mismo.... consigue ...
El
LC_ALL=C
objetivo 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.iconv
se puede combinar con cualquiera de ellos para obtener una solución integral.El
2>/dev/null
redireccionamiento descartadd
el informe de estado predeterminado del servidor y su stderr. Sin esto,dd
se completaría un trabajo como el anterior con información de impresión, como cuántos bytes se procesaron, etc.fuente
tr
cuando se manejan archivos grandes, ¡gracias!También puedes usar Perl 5:
La opción
-p
le 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$_
.-e
indica que el programa será el siguiente argumento, a diferencia de un archivo que contiene el script.lc
Convierte 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
El uso
-n
es como,-p
excepto 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 Perllc
pueda ser más fácil de reconocer en la localidad. Vea laperllocale
página del manual para más detalles.fuente
Debe capturar el patrón coincidente y luego usarlo en el reemplazo con un modificador:
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
\L
convierte el patrón capturado a minúsculas, hay también\U
para el caso superior.fuente
&
Además de la respuesta de MvG, también podría usar Perl 6:
perl6 -pe .=lc temp
Aquí $ _ está implícito, y no necesita las comillas simples para protegerlo de la expansión del shell ($ _ es un parámetro Bash especial; consulte: https://www.gnu.org/software/bash/manual/ html_node / Special-Parameters.html )
fuente