在sed或awk中大写字符串

Gre*_*egB 17 bash awk sed

我有三种类型的字符串,我想在bash脚本中大写.我认为sed/awk是我最好的选择,但我不确定.考虑到以下要求,最好的方法是什么?

  1. 单词
    例如 taco -> Taco

  2. 由连字符分隔的多个单词,
    例如 my-fish-tacos -> My-Fish-Tacos

  3. 由下划线分隔的多个单词,
    例如 my_fish_tacos -> My_Fish_Tacos

Pau*_*ce. 30

没有必要使用捕获组(虽然&在某种程度上是一个):

echo "taco my-fish-tacos my_fish_tacos" | sed 's/[^ _-]*/\u&/g'
Run Code Online (Sandbox Code Playgroud)

输出:

Taco My-Fish-Tacos My_Fish_Tacos
Run Code Online (Sandbox Code Playgroud)

转义的小写"u"将匹配的子字符串中的下一个字符大写.

  • @GregB:告诉它小写所有字符然后大写下一个字符:`sed's/[^ _-]*/\L\u&/ g'` (5认同)
  • 注意:这是GNU sed扩展.BSD sed用户(包括OS X)无法做到这一点. (2认同)

Ser*_*kyi 7

使用awk:

echo 'test' | awk '{
     for ( i=1; i <= NF; i++) {
         sub(".", substr(toupper($i), 1,1) , $i);
         print $i;
         # or
         # print substr(toupper($i), 1,1) substr($i, 2);
     }
}'
Run Code Online (Sandbox Code Playgroud)

  • 注意:使用 `toupper(substr(...`) 而不是 `substr(toupper(...`) 可能会稍微更有效。 (2认同)

And*_*ark 6

请尝试以下方法:

sed 's/\([a-z]\)\([a-z]*\)/\U\1\L\2/g'
Run Code Online (Sandbox Code Playgroud)

它适用于我使用GNU sed,但我不认为BSD sed支持\U\L.