web-dev-qa-db-ja.com

キリル文字の大文字からの最初の(大文字)文字を除くすべて小文字

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

キリル文字でごめんなさい。例えばАБРАЗИЯАбразия

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

:%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/

5
Xsi

EDIT:vimsedのどちらを使用すべきかについて混乱があるため。私は両方のソリューションを提供します:

Vim

次の置換は、最初の文字を除いて、単語を小文字に置き換えます。 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

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

\bsedの単語境界に一致し、残りはvimバージョンと同じです。 (GNU sedでテスト済み、文字クラスはすべてのsedバージョンでサポートされているとは限りません。)

5
Marco

これは正規表現で行うことができ、既存の回答はその方法を完全にカバーしていますが、別のアプローチがあります。

単一の単語の場合は、単語の最初の文字に移動して、次を使用します。

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の終わりに達すると、終了します(その種のエラーの場合と同様に、そうでない場合は永久に継続します)。

1
evilsoup