除了西里尔字母大写的第一个(大写)字母之外的所有小写字母

Xsi*_*Xsi 5 vim editors character-encoding text-processing regular-expression

使除第一个字母外的所有字母都小写。我更改后的第一个字母看起来像“大写”(从西里尔字母的大写)。其余(非大写)保持不变。

对不起,它是西里尔字母。例如?????????????

我发出了正确的一般命令:

:%s/\<\u\zs\u*/\L&/g
Run Code Online (Sandbox Code Playgroud)

它没有用

我的 linux 是 Gentoo,我的语言环境是 echo $LANG en_US.UTF-8。

我也试过:

 %s/\<[?-?]\zs\[?-?][?-?]*...
Run Code Online (Sandbox Code Playgroud)

我不知道如何正确使用这种语法。我想它可能会起作用。

我不明白,即使之后

:se noic /[[:upper:]] 
Run Code Online (Sandbox Code Playgroud)

不起作用。必须是语言环境的东西(我想知道)。

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
Run Code Online (Sandbox Code Playgroud)

尽管所有字母都与 Unicode 编号的大小相同。

我又重新检查了一遍:

file -bi geod.txt
text/plain; charset=utf-8
Run Code Online (Sandbox Code Playgroud)

所以 utf-8 没问题(尽管“文件”可能会出错)。

这是我的源文件:http : //bpaste.net/show/140967/

Mar*_*rco 5

编辑:因为对于是否vimsed应该使用存在一些混淆。我为两者提供解决方案:

维姆

以下替换用小写字符替换单词,第一个字母除外。单字母单词转换为大写。

:%s/\<\(\k\)\(\k*\)\>/\u\1\L\2/g
Run Code Online (Sandbox Code Playgroud)

\k匹配字母数字字符和_. 广泛使用\w的等效[A-Za-z0-9_]于西里尔字母,并且会在西里尔字母上失败。

\<\>抓住字边界和括号组匹配到的第一个字母,剩下的,正被使用检索\1\2分别。

要使此模式起作用,您需要将 vim 设置为使用 UTF-8。

set encoding=utf-8
Run Code Online (Sandbox Code Playgroud)

sed

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

\b匹配 中的单词边界sed,其余与vim版本相同。(在 GNU sed 上测试,可能并非所有sed版本都支持字符类。)