最初の文字を除くすべての文字を小文字にする。変更した後の最初の文字は「大文字」のようになります(キリル文字の大文字から)。残り(大文字ではない)は変更されません。
キリル文字でごめんなさい。例えばАБРАЗИЯАбразия
正しい一般コマンドを発行しました:
:%s/\<\u\zs\u*/\L&/g
そしてそれはうまくいきませんでした
私のLinuxはGentooで、ロケールはecho $ LANGen_US.UTF-8です。
私も試しました:
%s/\<[А-Я]\zs\[А-Я][а-я]*...
この構文を正しく使用する方法がわかりません。私はそれがうまくいくかもしれないと思います。
後でもわからない
:se noic /[[:upper:]]
動作しません。ロケールのものでなければなりません(私は疑問に思います)。
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
すべての文字はUnicodeの番号付けと同じ大きさですが。
もう一度確認しました:
file -bi geod.txt
text/plain; charset=utf-8
したがって、utf-8では問題ありません(「ファイル」がうまくいかない可能性がありますが)。
これが私のソースファイルです: http://bpaste.net/show/140967/
EDIT:vim
とsed
のどちらを使用すべきかについて混乱があるため。私は両方のソリューションを提供します:
次の置換は、最初の文字を除いて、単語を小文字に置き換えます。 1文字の単語は大文字に変換されます。
:%s/\<\(\k\)\(\k*\)\>/\u\1\L\2/g
\k
は英数字に一致し、_
は一致します。広く使用されている\w
は[A-Za-z0-9_]
と同等であり、キリル文字では失敗します。
\<
と\>
は単語の境界を取得し、括弧は一致を最初の文字と残りの文字にグループ化します。これらはそれぞれ\1
と\2
を使用して取得されます。
このパターンを機能させるには、UTF-8を使用するようにvimを設定する必要があります。
set encoding=utf-8
sed 's/\b\([[:alpha:]]\)\([[:alpha:]]*\)\b/\u\1\L\2/g' <inputfile>
\b
はsed
の単語境界に一致し、残りはvim
バージョンと同じです。 (GNU sedでテスト済み、文字クラスはすべてのsed
バージョンでサポートされているとは限りません。)
これは正規表現で行うことができ、既存の回答はその方法を完全にカバーしていますが、別のアプローチがあります。
単一の単語の場合は、単語の最初の文字に移動して、次を使用します。
lgue
複数の単語を実行するには、マクロを使用する必要があります
qqlguewq
私はこれを分解します:
qq
-q
というマクロの記録を開始しますl
(これは小文字のLです)-1文字を右に移動しますgue
-すべての文字を小文字(gu
)で現在の単語の末尾(e
)にします。w
-次の単語の最初の文字に移動しますq
-マクロの記録を停止します@q
を使用してマクロを呼び出すことができます。 9@q
で9回、42@q
で42回呼び出すことができます。この特定のマクロでは、任意の回数呼び出すのが安全です。したがって、9999@q
を使用できます。
別のルートは再帰マクロです。
qqqqqlguew@qq
qqq
-q
マクロの記録を開始し、すぐに記録を停止して、そのレジスタを効果的に空白にします@q
-q
マクロを呼び出します。これは現在空白ですが、マクロの記録を停止するとnotになります。マクロがドキュメント内の最後のWordの終わりに達すると、終了します(その種のエラーの場合と同様に、そうでない場合は永久に継続します)。