Todas as letras minúsculas, exceto a primeira (maiúscula), de MAIÚSCULAS em cirílico

Todas as letras minúsculas, exceto a primeira (maiúscula), de MAIÚSCULAS em cirílico

Para tornar todas as letras minúsculas, exceto a primeira letra. A primeira letra ficaria como "Maiúscula" depois que eu mudasse (de MAIÚSCULA para cirílico). O resto (não MAIÚSCULAS) permanece inalterado.

Lamento que esteja em cirílico. por exemplo, АБРАЗИЯ Абразия

Eu emiti o comando geral correto:

:%s/\<\u\zs\u*/\L&/g

E não funcionou

Meu linux é Gentoo, minha localidade é echo $LANG en_US.UTF-8.

Eu tentei também:

 %s/\<[А-Я]\zs\[А-Я][а-я]*...

Não sei como usar corretamente essa sintaxe. Eu acho que pode funcionar.

Eu não entendo, mesmo depois

:se noic /[[:upper:]] 

não funciona. Deve ser uma questão de localidade (eu me pergunto).

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

Embora todas as letras tenham a mesma magnitude da numeração Unicode.

Verifiquei novamente:

file -bi geod.txt
text/plain; charset=utf-8

Portanto, está tudo bem com o utf-8 (embora "arquivo" possa dar errado).

Aqui está meu arquivo fonte: http://bpaste.net/show/140967/

Responder1

EDITAR:Uma vez que existe alguma confusão sobre se vimou seddeve ser usado. Eu forneço soluções para ambos:

Vim

A substituição a seguir substitui as palavras por caracteres minúsculos, exceto a primeira letra. Palavras de uma letra são convertidas para maiúsculas.

:%s/\<\(\k\)\(\k*\)\>/\u\1\L\2/g

\kcorresponde a caracteres alfanuméricos e _. O amplamente utilizado \wé equivalente [A-Za-z0-9_]e falhará nas letras cirílicas.

Os \<e \>pegam os limites da palavra e os parênteses agrupam a correspondência na primeira letra e no restante, que está sendo recuperado usando \1e \2, respectivamente.

Para que esse padrão funcione, você precisa configurar o vim para usar UTF-8.

set encoding=utf-8

Sed

sed 's/\b\([[:alpha:]]\)\([[:alpha:]]*\)\b/\u\1\L\2/g' <inputfile>

\bcorresponde aos limites das palavras em sed, o resto é igual à vimversão. (Testado em GNU sed, as classes de caracteres podem não ser suportadas em todas sedas versões.)

Responder2

Isso pode ser feito com expressões regulares, e a resposta existente cobre esse método perfeitamente, mas há outra abordagem.

Para uma única palavra, basta ir até a primeira letra da palavra e usar:

lgue

Para fazer mais de uma palavra, você vai querer usar uma macro

qqlguewq

Vou detalhar isso:

  • qq-- comece a gravar uma macro chamadaq
  • l(é um L minúsculo) - mova um caractere para a direita
  • gue-- coloca todos os caracteres em minúsculas (este é o gu) no final da palavra atual ( e)
  • w- vá para o primeiro caractere da próxima palavra
  • q-- pare de gravar a macro

Você pode chamar a macro com @q. Você pode chamá-lo nove vezes 9@qou quarenta e duas vezes com 42@q. Com esta macro específica, é seguro chamá-la um número arbitrário de vezes - então você pode usar 9999@q.

Outra rota é uma macro recursiva:

qqqqqlguew@qq
  • qqq- começa a gravar a qmacro e para imediatamente a gravação, apagando efetivamente esse registro
  • @q-- chama a qmacro, que está em branco agora, mas iránãoseja quando você parar de gravar a macro
  • O resto se comporta como acima

Quando a macro atingir o final da palavra final do documento, ela será encerrada (como acontecerá com qualquer erro desse tipo - caso contrário, continuaria para sempre).

informação relacionada