Search code examples
bashsedawk

Capitalize strings in sed or awk


I have three types of strings that I'd like to capitalize in a bash script. I figured sed/awk would be my best bet, but I'm not sure. What's the best way given the following requirements?

  1. single word
    e.g. taco -> Taco

  2. multiple words separated by hyphens
    e.g. my-fish-tacos -> My-Fish-Tacos

  3. multiple words separated by underscores
    e.g. my_fish_tacos -> My_Fish_Tacos


Solution

  • There's no need to use capture groups (although & is a one in a way):

    echo "taco my-fish-tacos my_fish_tacos" | sed 's/[^ _-]*/\u&/g'
    

    The output:

    Taco My-Fish-Tacos My_Fish_Tacos
    

    The escaped lower case "u" capitalizes the next character in the matched sub-string.