
使除第一個字母之外的所有字母都小寫。我更改後,第一個字母看起來像“大寫”(從西里爾字母的大寫)。其餘部分(非大寫)保持不變。
抱歉,這是西里爾文。例如 АБРАЗИЯ Абразия
我發出了正確的一般命令:
:%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
宏,現在是空白的,但會不是一旦你停止錄製宏- 其餘部分的行為如上
當巨集到達文件中最後一個單字的末尾時,它將退出(對於任何此類錯誤都會退出 - 否則它將永遠繼續)。