Minúscula, exceto a primeira letra (maiúscula) do UPPERCASE em cirílico

5

Para tornar todas as letras minúsculas, exceto a primeira letra. A primeira letra seria como "Maiúscula" depois que eu mudei (de UPPERCASE em cirílico). O resto (não UPPERCASED) não muda.

Sinto muito 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 é o Gentoo, minha localidade é echo $ LANG en_US.UTF-8.

Eu também tentei:

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

Eu não sei como usar corretamente esta sintaxe. Eu acho que pode funcionar.

Eu não entendo, mesmo depois de

:se noic /[[:upper:]] 

não funciona. Deve ser uma coisa local (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.

Voltei a verificar novamente:

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

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

Aqui está meu arquivo de origem: link

    
por Xsi 16.10.2013 / 13:44

2 respostas

4

EDIT: Já que há alguma confusão sobre se vim ou sed deve ser usado. Eu ofereço soluções para ambos:

Vim

A seguinte substituição substitui as palavras por minúsculas, exceto a primeira letra. Palavras de uma única letra são convertidas em maiúsculas.

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

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

Os \< e \> pegam os limites de palavras e os parênteses agrupam a correspondência na primeira letra e o restante, que está sendo recuperado usando e , respectivamente.

Para este padrão funcionar, você precisa configurar o vim para usar o UTF-8.

set encoding=utf-8

Sed

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

\b corresponde a limites de palavras em sed , o restante é igual à versão vim . (Testado no GNU sed, as classes de caracteres podem não ser suportadas em todas as versões sed .)

    
por 16.10.2013 / 13:57
1

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 passar para a primeira letra da palavra e usar:

lgue

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

qqlguewq

Eu vou quebrar isso:

  • qq - começa a gravar uma macro chamada q
  • l (que é um L minúsculo) - mova um caractere para a direita
  • gue - liga todos os caracteres minúsculos (que é o gu ) ao final da palavra atual ( e )
  • w - vai para o primeiro caracter da próxima palavra
  • q - parar de gravar a macro

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

Outra rota é uma macro recursiva:

qqqqqlguew@qq
  • qqq - inicia a gravação da macro q e, em seguida, interrompe imediatamente a gravação, apagando efetivamente esse registro
  • @q - chama a macro q , que está em branco agora, mas não será uma vez que você parar de gravar a macro
  • O restante se comporta como acima

Quando a macro atinge o final da palavra final no documento, ela será encerrada (como ocorre com qualquer erro desse tipo - caso contrário, ela continuará para sempre).

    
por 16.10.2013 / 15:48