キリル文字の UPPERCASE の最初の文字 (大文字) 以外をすべて小文字にする

キリル文字の UPPERCASE の最初の文字 (大文字) 以外をすべて小文字にする

最初の文字を除くすべての文字を小文字にします。最初の文字は、変更後「大文字」のようになります (キリル文字の大文字から)。残りの文字 (大文字ではない文字) は変更されません。

キリル文字で申し訳ありません。例: АБРАЗИЯ Абразия

私は正しい一般コマンドを発行しました:

:%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文字右に移動する
  • guegu--現在の単語の末尾までのすべての文字 ( ) を小文字にします( e)
  • w-- 次の単語の最初の文字へ移動
  • q-- マクロの記録を停止します

マクロは を使用して呼び出すことができます@q。 を使用すると 9 回呼び出すことができ9@q、 を使用すると 42 回呼び出すことができます。42@qこの特定のマクロでは、任意の回数呼び出すことが安全であるため、 を使用できます9999@q

もう一つのルートは再帰マクロです:

qqqqqlguew@qq
  • qqq--qマクロの記録を開始し、すぐに記録を停止し、実質的にそのレジスタを空にします。
  • @q--qマクロを呼び出します。現在は空白ですが、ないマクロの記録を停止すると
  • 残りは上記と同じ動作をする

マクロは、ドキュメント内の最後の単語の終わりに達すると終了します (この種のエラーの場合と同様に終了します。そうでない場合は、マクロは永久に継続します)。

関連情報