%2C%20de%20MAI%C3%9ASCULAS%20em%20cir%C3%ADlico.png)
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 vim
ou sed
deve 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
\k
corresponde 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 \1
e \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>
\b
corresponde aos limites das palavras em sed
, o resto é igual à vim
versão. (Testado em GNU sed, as classes de caracteres podem não ser suportadas em todas sed
as 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 direitague
-- coloca todos os caracteres em minúsculas (este é ogu
) no final da palavra atual (e
)w
- vá para o primeiro caractere da próxima palavraq
-- pare de gravar a macro
Você pode chamar a macro com @q
. Você pode chamá-lo nove vezes 9@q
ou 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 aq
macro e para imediatamente a gravação, apagando efetivamente esse registro@q
-- chama aq
macro, 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).