You seem to have a text file with each word on its own line.
You may use
grep '^[[:lower:]]*[[:upper:]][[:lower:]]*$' file
See the grep
online demo.
The ^
matches the start of string (here, line since grep
operates on a line by lin basis by default), then [[:lower:]]*
matches 0 or more lowercase letters, then an [[:upper:]]
pattern matches any uppercase letter, and then [[:lower:]]*
matches 0+ lowercase letters and $
asserts the position at the end of string.
If you need to match a whole line with exactly one uppercase letter you may use
grep '^[^[:upper:]]*[[:upper:]][^[:upper:]]*$' file
The only difference from the pattern above is the [^[:upper:]]
bracket expression that matches any char but an uppercase letter. See another grep
online demo.
To extract words with a single capital letter inside them you may use word boundaries, as shown in mathguy's answer. With GNU grep, you may also use
grep -o '\b[^[:upper:]]*[[:upper:]][^[:upper:]]*\b' file
grep -o '\b[[:lower:]]*[[:upper:]][[:lower:]]*\b' file
See yet another grep
online demo.