Minúsculas todas menos la primera letra (mayúscula) de MAYÚSCULAS en cirílico

Minúsculas todas menos la primera letra (mayúscula) de MAYÚSCULAS en cirílico

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 vimo . sedOfrezco 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

\kcoincide con caracteres alfanuméricos y _. El ampliamente utilizado \wequivale [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 \1y \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>

\bcoincide con los límites de las palabras en sed, el resto es igual que la vimversión. (Probado en GNU sed, es posible que las clases de caracteres no sean compatibles con todas sedlas 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 derecha
  • gue-- convierte cada carácter en minúscula (ese es gu) al final de la palabra actual ( e)
  • w--va al primer carácter de la siguiente palabra
  • q-- 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 la qmacro, luego detiene inmediatamente la grabación, borrando efectivamente ese registro
  • @q-- llama a la qmacro, 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).

información relacionada