I\'m an awk newbie, so please bear with me.
The goal is to change the case of a string such that the first letter of every word is uppercase and the remaining letters ar
The issue is that \B
(zero-width non-word boundary) only seems to match at the beginning of the line, so $1
works but $2
and following fields do not match the regex, so they are not substituted and remain uppercase. Not sure why \B
doesn't match except for the first field... B should match anywhere within any word:
echo 'ABCD EFGH IJKL MNOP' | awk '{for (i=1; i<=NF; ++i) { print match($i, /\B/); }}'
2 # \B matches ABCD at 2nd character as expected
0 # no match for EFGH
0 # no match for IJKL
0 # no match for MNOP
Anyway to achieve your result (capitalize only the first character of the line), you can operate on $0
(the whole line) instead of using a for
loop:
echo 'ABCD EFGH IJKL MNOP' | awk '{print toupper(substr($0,1,1)) tolower(substr($0,2)) }'
Or if you still wanted to capitalize each word separately but with awk
only:
awk '{for (i=1; i<=NF; ++i) { $i=toupper(substr($i,1,1)) tolower(substr($i,2)); } print }'