%20%E4%BB%A5%E5%A4%96%E3%82%92%E3%81%99%E3%81%B9%E3%81%A6%E5%B0%8F%E6%96%87%E5%AD%97%E3%81%AB%E3%81%99%E3%82%8B.png)
最初の文字を除くすべての文字を小文字にします。最初の文字は、変更後「大文字」のようになります (キリル文字の大文字から)。残りの文字 (大文字ではない文字) は変更されません。
キリル文字で申し訳ありません。例: АБРАЗИЯ Абразия
私は正しい一般コマンドを発行しました:
:%s/\<\u\zs\u*/\L&/g
そしてそれはうまくいかなかった
私の Linux は Gentoo で、ロケールは echo $LANG en_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/
答え1
編集:または を使用すべきかどうかについては混乱があるため、両方に対する解決策を示し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
バージョンでサポートされているとは限りません。)
答え2
これは正規表現を使用して実行でき、既存の回答でその方法が十分にカバーされていますが、別のアプローチもあります。
単語 1 つの場合は、単語の最初の文字に移動して次のように使用します。
lgue
複数の単語を実行するには、マクロを使用する必要があります
qqlguewq
これを詳しく説明します:
qq
-- マクロの記録を開始しますq
l
(小文字のLです)-- 1文字右に移動するgue
gu
--現在の単語の末尾までのすべての文字 ( ) を小文字にします(e
)w
-- 次の単語の最初の文字へ移動q
-- マクロの記録を停止します
マクロは を使用して呼び出すことができます@q
。 を使用すると 9 回呼び出すことができ9@q
、 を使用すると 42 回呼び出すことができます。42@q
この特定のマクロでは、任意の回数呼び出すことが安全であるため、 を使用できます9999@q
。
もう一つのルートは再帰マクロです:
qqqqqlguew@qq
qqq
--q
マクロの記録を開始し、すぐに記録を停止し、実質的にそのレジスタを空にします。@q
--q
マクロを呼び出します。現在は空白ですが、ないマクロの記録を停止すると- 残りは上記と同じ動作をする
マクロは、ドキュメント内の最後の単語の終わりに達すると終了します (この種のエラーの場合と同様に終了します。そうでない場合は、マクロは永久に継続します)。