Bash中如何让sed命令支持非拉丁字母开头单词首字母大写
非拉丁字母首字母大写处理方案
问题原因
之前的方案失效核心有两个原因:
LC_ALL=C的locale仅支持ASCII字符集,无法识别ä、é、а这类非拉丁的Unicode字母,[[:alpha:]]匹配规则和\u转大写逻辑都会跳过这类字符。- 如果使用的是macOS自带的BSD sed,本身就不支持
\u转义符,哪怕设置了正确的locale也无法生效。
可行解决方法
方案1:GNU sed 搭配正确locale(适合Linux环境)
首先设置对应语言的UTF-8 locale,比如处理德语可以设置:
export LC_ALL=de_DE.UTF-8 # 不确定对应语言的话,用通用的en_US.UTF-8也可覆盖绝大多数欧洲字母语言
再执行适配行首空白的sed命令:sed -E 's/^[[:space:]]*([[:alpha:]])/\u\1/' 目标文件
如果需要直接修改原文件,加 -i 参数即可。
方案2:Perl 跨平台通用方案(推荐,适配所有Unicode字母)
该方案无需适配locale,Linux、macOS都可直接使用,支持所有语言的字母大小写转换:perl -CIO -pe 's/^\s*(\p{L})/uc($1)/e' 目标文件
参数说明:
-CIO指定输入输出都按UTF-8编码处理\p{L}匹配任意Unicode标准中的字母字符uc()是Perl的转大写函数,e参数表示替换段作为代码执行
方案3:GNU awk 方案
GNU awk 4.0以上版本也支持Unicode字符处理:awk -v LC_ALL=de_DE.UTF-8 '{ match($0, /^[[:space:]]*[[:alpha:]]/); print toupper(substr($0, RSTART, RLENGTH)) substr($0, RSTART+RLENGTH) }' 目标文件
内容的提问来源于stack exchange,提问作者M.M
相关产品推荐
相关产品推荐

