我是awk新手,所以请多多包涵。
目标是更改字符串的大小写,使每个单词的第一个字母为大写,其余字母为小写。(为了简单起见,这里的“单词”被定义为严格的字母字符;所有其他字符都被视为分隔符。)
我从本网站的另一篇文章中学到了一种很好的方法,可以使用以下 awk 命令将每个单词的首字母大写:
echo 'abce efgh ijkl mnop' | awk '{for (i=1;i <= NF;i++) {sub(".",substr(toupper($i),1,1),$i)} print}'
--> Abcd Efgh Ijkl Mnop
通过在 awk 命令前加上 tr 命令可以轻松完成剩余的字母小写:
echo 'aBcD EfGh ijkl MNOP' | tr [A-Z] [a-z] | awk '{for (i=1;i <= NF;i++) {sub(".",substr(toupper($i),1,1),$i)} print}'
--> Abcd Efgh Ijkl Mnop
但是,为了了解更多关于 awk 的信息,我想用类似的 awk 结构将除第一个字母以外的所有字母的大小写更改为小写。我使用正则表达式\B[A-Za-z]+
匹配单词的所有字母,但第一个字母除外,并使用 awk 命令substr(tolower($i),2)
以小写形式提供相同的字母,如下所示:
echo 'ABCD EFGH IJKL MNOP' | awk '{for (i=1;i <= NF;i++) {sub("\B[A-Za-z]+",substr(tolower($i),2),$i)} print}'
--> Abcd EFGH IJKL MNOP
请注意,第一个单词已正确转换,但其余单词保持不变。我将非常感谢解释为什么剩余的单词没有正确转换以及如何让他们这样做。