%20de%20MAY%C3%9ASCULAS%20en%20cir%C3%ADlico.png)
Para convertir todas las letras en minúsculas excepto la primera letra. La primera letra se vería como "Mayúscula" después de cambiarla (de MAYÚSCULAS a cirílico). El resto (no MAYÚSCULAS) se deja sin cambios.
Lo siento, está en cirílico. por ejemplo, АБРАЗИЯ Абразия
Emití la orden general correcta:
:%s/\<\u\zs\u*/\L&/g
Y no funcionó
Mi Linux es Gentoo, mi configuración regional es echo $LANG en_US.UTF-8.
Intenté también:
%s/\<[А-Я]\zs\[А-Я][а-я]*...
No sé cómo utilizar correctamente esta sintaxis. Supongo que podría funcionar.
No lo entiendo, incluso después
:se noic /[[:upper:]]
no funciona. Debe ser una cuestión local (me pregunto).
sed -n '322p' geod.txt | cut -f 1 -d " "
АВГИТИТ—
sed -n '322p' geod.txt | cut -f 1 -d " " | xxd
0000000: d090 d092 d093 d098 d0a2 d098 d0a2 e280
Aunque todas las letras tienen la misma magnitud que la numeración Unicode.
He vuelto a comprobar:
file -bi geod.txt
text/plain; charset=utf-8
Entonces está bien con utf-8 (aunque "archivo" podría salir mal).
Aquí está mi archivo fuente: http://bpaste.net/show/140967/
Respuesta1
EDITAR:Ya que existe cierta confusión sobre si se debe utilizar vim
o . sed
Ofrezco soluciones para ambos:
Empuje
La siguiente sustitución reemplaza las palabras con caracteres en minúscula, excepto la primera letra. Las palabras de una sola letra se convierten a mayúsculas.
:%s/\<\(\k\)\(\k*\)\>/\u\1\L\2/g
\k
coincide con caracteres alfanuméricos y _
. El ampliamente utilizado \w
equivale [A-Za-z0-9_]
y fallará en letras cirílicas.
Los \<
y \>
toman los límites de las palabras y los paréntesis agrupan la coincidencia en la primera letra y el resto, que se recuperan usando \1
y \2
, respectivamente.
Para que este patrón funcione, necesita configurar vim para usar UTF-8.
set encoding=utf-8
sed
sed 's/\b\([[:alpha:]]\)\([[:alpha:]]*\)\b/\u\1\L\2/g' <inputfile>
\b
coincide con los límites de las palabras en sed
, el resto es igual que la vim
versión. (Probado en GNU sed, es posible que las clases de caracteres no sean compatibles con todas sed
las versiones).
Respuesta2
Esto se puede hacer con expresiones regulares y la respuesta existente cubre ese método perfectamente, pero hay otro enfoque.
Para una sola palabra, simplemente vaya a la primera letra de la palabra y use:
lgue
Para hacer más de una palabra, querrás usar una macro.
qqlguewq
Voy a desglosar esto:
qq
-- comienza a grabar una macro llamadaq
l
(esa es una L minúscula): mueve un carácter hacia la derechague
-- convierte cada carácter en minúscula (ese esgu
) al final de la palabra actual (e
)w
--va al primer carácter de la siguiente palabraq
-- deja de grabar la macro
Puedes llamar a la macro con @q
. Puedes llamarlo nueve veces con 9@q
, o cuarenta y dos veces con 42@q
. Con esta macro en particular es seguro llamarla un número arbitrario de veces, por lo que puedes usar 9999@q
.
Otra ruta es una macro recursiva:
qqqqqlguew@qq
qqq
-- comienza a grabar laq
macro, luego detiene inmediatamente la grabación, borrando efectivamente ese registro@q
-- llama a laq
macro, que ahora está en blanco, peronoser una vez que dejas de grabar la macro- El resto se comporta como arriba.
Cuando la macro llegue al final de la última palabra del documento, saldrá (como sucederá con cualquier error de ese tipo; de lo contrario, continuaría para siempre).