I need to change the first letter of every line in a file to uppercase, e.g.
the bear ate the fish.
the river was too fast.
Would become:
There's a few sed answers with s/^\(.\)/\U\1/
. GNU sed also has a \u
directive that changes only the next letter to uppercase, so
sed 's/./\u&/'
Although if the first character on a line is a space, you won't see an uppercase letter, so
sed 's/[[:alpha:]]/\u&/'
To change the file in place:
sed -i -e 's/^\(.\)/\U\1/' file.txt
Pure bash
:
while read x ; do echo "${x^*}" ; done < inputfile > outputfile
Test/demo (remove the code after done
for more complete output):
for f in a, a, á, à, ǎ, ā, b, c, d, e, e, é, è, ě, ē, f, g, h, i, i, í, ì, ǐ, ī, \
j, k, l, m, n, o, o, ó, ò, ǒ, ō, p, q, r, s, t, \
u, u, ú, ù, ǔ, ü, ǘ, ǜ, ǚ, ǖ, ū, v, w, x, y, and z.
do echo "$f foo bar." ; done |
while read x ; do echo "${x^*}" ; done | head -15 | tail -6
Output:
E, foo bar.
E, foo bar.
É, foo bar.
È, foo bar.
Ě, foo bar.
Ē, foo bar.
You can put your special characters in place of a-z and A-Z
function up { local c="$1" ; echo -e "$c" | tr '[a-z]' '[A-Z]' ; }
while read line
do
echo $(up ${line:0:1})${line:1}
done
pearl.311> cat file1
linenumber11
linenumber2
linenumber1
linenumber4
linenumber6
pearl.312> awk '{print toupper(substr($0,1,1))""substr($0,2)}' file1
Linenumber11
Linenumber2
Linenumber1
Linenumber4
Linenumber6
pearl.313>
Use sed
:
sed 's/^\(.\)/\U\1/' yourfile > convertedfile
Little explanation:
^
represents the start of a line..
matches any character\U
converts to uppercase\( ... \)
specifies a section to be referenced later (as \1
in this case); parentheses are to be escaped here.Do not try to redirect the output to the same file in one command (i.e. ) as you will lose your data. If you want to replace in the same file then check out joelparkerhenderson's answer.> yourfile