shell如何实现每行首个字母大写,行首非字母时向后查找处理
文本行首字母大写处理解决方案
你之前使用的sed 's/^\(.\)/\U\1/'命令存在逻辑缺陷:正则^\(.\)仅匹配行首第一个字符,不会跳过非字母字符查找后续的字母,因此行首为数字、特殊符号时无法达到预期效果。
方案1:GNU Sed(多数Linux发行版默认自带)
利用sed默认仅替换第一个匹配项的特性,直接匹配每行第一个英文字母做大写转换即可:
sed 's/[a-zA-Z]/\U&/' myfile.txt > convertedfile.txt
命令说明:
[a-zA-Z]匹配任意一个英文字母\U&表示将匹配到的内容转为大写,&指代前面正则匹配到的第一个字母- 未加全局替换标记
g,因此只会处理每行第一个匹配到的字母,自动跳过前面的非字母字符,完全符合需求
方案2:通用Awk方案(兼容所有Unix-like环境,无GNU Sed依赖)
如果你的环境没有GNU Sed(比如macOS默认的BSD Sed不支持\U语法),可以用awk实现:
awk '{ if(match($0, /[a-zA-Z]/)) { $0 = substr($0, 1, RSTART-1) toupper(substr($0, RSTART, 1)) substr($0, RSTART+1) } print $0 }' myfile.txt > convertedfile.txt
内容的提问来源于stack exchange,提问作者M9A
相关产品推荐
相关产品推荐

