將西里爾字母大寫中除第一個(大寫)字母以外的所有字母小寫

將西里爾字母大寫中除第一個(大寫)字母以外的所有字母小寫

使除第一個字母之外的所有字母都小寫。我更改後,第一個字母看起來像“大寫”(從西里爾字母的大寫)。其餘部分(非大寫)保持不變。

抱歉,這是西里爾文。例如 АБРАЗИЯ Абразия

我發出了正確的一般命令:

:%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應該使用存在一些困惑。我為兩者提供解決方案:

維姆

以下替換將單字替換為小寫字元(第一個字母除外)。單字母單字將轉換為大寫。

:%s/\<\(\k\)\(\k*\)\>/\u\1\L\2/g

\k匹配字母數字字元和_.廣泛使用的\w等效於[A-Za-z0-9_]西里爾字母,但在西里爾字母上會失敗。

\<抓取\>單字邊界,括號將配對分組為第一個字母和其餘字母,分別使用\1和檢索\2

要使此模式發揮作用,您需要將 vim 設定為使用 UTF-8。

set encoding=utf-8

塞德

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

\b配對 中的單字邊界sed,其餘與版本相同vim。 (在 GNU sed 上測試,字元類別可能並非在所有sed版本中都受支援。)

答案2

這可以使用正規表示式來完成,現有的答案很好地涵蓋了該方法,但還有另一種方法。

對於單個單詞,只需移至該單詞的第一個字母並使用:

lgue

要執行多個單字,您需要使用宏

qqlguewq

我將對此進行分解:

  • qq-- 開始錄製一個名為q
  • l(這是一個小寫的 L)-向右移動一個字符
  • gue-- 將每個字元小寫(即gu)到目前單字的末尾 ( e)
  • w-- 轉到下一個單字的第一個字符
  • q-- 停止錄製巨集

您可以使用 來呼叫巨集@q。您可以使用 呼叫它九次9@q,或使用 呼叫它四十二次42@q。對於這個特定的宏,可以安全地調用它任意次數——因此您可以使用9999@q.

另一種路線是遞歸宏:

qqqqqlguew@qq
  • qqq-- 開始錄製q宏,然後立即停止錄製,有效地清空該暫存器
  • @q-- 呼叫q宏,現在是空白的,但會不是一旦你停止錄製宏
  • 其餘部分的行為如上

當巨集到達文件中最後一個單字的末尾時,它將退出(對於任何此類錯誤都會退出 - 否則它將永遠繼續)。

相關內容